- ベストアンサー
char型ポインタ
よくプログラムで charポインタだけ指定して、 #include<stdio.h> int main(){ char* p; p = "abcdef"; printf("%s",p); return 0; } のようにしているのをみかけますが、 メモリーを確保していなくても問題ないのでしょうか? char* p; p = (char*)malloc(7); strcpy(p,"abcdef"); としたのと同じでしょうか?
- みんなの回答 (3)
- 専門家の回答
質問者が選んだベストアンサー
"abcdef"等の文字列リテラルは、リードオンリーな静的領域という部分に確保されます。このエリアは、プロセス開始時点(プログラム実行開始時点)でメモリ内部に確保され、プロセスが終了(プログラムの終了)するまで保障されます。つまり、上書きされる心配はありません。 ご参考までに・・・・
その他の回答 (2)
- nakashi
- ベストアンサー率51% (21/41)
>つまり一時的にメモリーが確保されるということでしょうか? いいえ恒久的にメモリーが確保 心配ならconstをつけましょう char* p1 = "xyz"; const char* p2 = "abcdefg"; p1[0] = 0; // コンパイルエラーにならず、実行時エラー p2[0] = 0; // error C2166: 左辺値は const オブジェクトに指定されています
お礼
大変参考になります。 ありがとうございます。
- liar_adan
- ベストアンサー率48% (730/1515)
問題ありません。 プログラムの中に 「abcdef」という文字列を記憶しておく必要がありますよね? それは、プログラムが起動されるときに、 一緒にメモリ上にコピーされます。 p = "abcdef";としたとき、 pは、そのメモリの位置を指します。
お礼
ご回答ありがとうございます。 つまり一時的にメモリーが確保されるということでしょうか? たとえば p = "abcdef"; p2 = "fghijk"; p3 = "lmnopq"; p4 = "rstuvw"; ・ ・ ・ printf("%s",p); とかやっていると、運が悪いといつかpの部分のメモリーが上書きされるような気がするのですが、 それは大丈夫なのでしょうか。 よろしくお願いいたします。
お礼
納得しました。 ありがとうございます。