• ベストアンサー

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"); としたのと同じでしょうか?

質問者が選んだベストアンサー

  • ベストアンサー
  • tancoro
  • ベストアンサー率52% (11/21)
回答No.3

"abcdef"等の文字列リテラルは、リードオンリーな静的領域という部分に確保されます。このエリアは、プロセス開始時点(プログラム実行開始時点)でメモリ内部に確保され、プロセスが終了(プログラムの終了)するまで保障されます。つまり、上書きされる心配はありません。 ご参考までに・・・・

sha-girl
質問者

お礼

納得しました。 ありがとうございます。

その他の回答 (2)

  • nakashi
  • ベストアンサー率51% (21/41)
回答No.2

>つまり一時的にメモリーが確保されるということでしょうか? いいえ恒久的にメモリーが確保 心配ならconstをつけましょう char* p1 = "xyz"; const char* p2 = "abcdefg"; p1[0] = 0; // コンパイルエラーにならず、実行時エラー p2[0] = 0; // error C2166: 左辺値は const オブジェクトに指定されています

sha-girl
質問者

お礼

大変参考になります。 ありがとうございます。

  • liar_adan
  • ベストアンサー率48% (730/1515)
回答No.1

問題ありません。 プログラムの中に 「abcdef」という文字列を記憶しておく必要がありますよね? それは、プログラムが起動されるときに、 一緒にメモリ上にコピーされます。 p = "abcdef";としたとき、 pは、そのメモリの位置を指します。

sha-girl
質問者

お礼

ご回答ありがとうございます。 つまり一時的にメモリーが確保されるということでしょうか? たとえば p = "abcdef"; p2 = "fghijk"; p3 = "lmnopq"; p4 = "rstuvw"; ・ ・ ・ printf("%s",p); とかやっていると、運が悪いといつかpの部分のメモリーが上書きされるような気がするのですが、 それは大丈夫なのでしょうか。 よろしくお願いいたします。

関連するQ&A

専門家に質問してみよう