• ベストアンサー

ポインタに文字列を代入した場合、メモリはいつ開放されるか。

C言語で、 char *p = "abcd"; の様にポインタに文字列を代入した場合'a','b','c','d','\0'が格納されているメモリ領域はいつ開放されるのでしょうか。 また、このような文字列は、 *(p + 2) = 'f'; というふうに後から一部の値を変更することはできるのでしょうか。 的外れな質問かもしれませんがよろしくお願いします。

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

  • ベストアンサー
回答No.1

環境にもよりますが、一般的な「windows+vc」で話をさせていただきます。 "abcd"はデータセグメントの領域に格納され、プログラムの起動から終了までメモリ上に置かれたままとなります。 データセグメントの領域は書換不可領域のため、アクセス違反でエラーとなります。

johnsmith_
質問者

お礼

ありがとうございます。 入門書などには書かれていなかったので気になっていました。

その他の回答 (2)

  • Tacosan
  • ベストアンサー率23% (3656/15482)
回答No.3

char *p = "abcd"; *(p+2) = 'f'; は「未定義動作」だから何が起きても文句はいえない. 普通は「何事もなかったかのように動く」か「実行時エラーになる」のどちらかだが, 実際にはどうなるかわからない. 例えば, #include <stdio.h> int main() { char *p = "abcd"; *(p+2) = 'f'; printf("%s\n", "abcd"); return 0; } とやったときに「abfd」と表示されるかもしれない. あるいは, いきなり鼻歌を歌い出すかも.

johnsmith_
質問者

お礼

つまり、後からの変更はやらない方がいいということですね。 参考になりました。

  • asuncion
  • ベストアンサー率33% (2127/6289)
回答No.2

後から一部を書き換えるようなコードを書いてみると、 どういう結果を得るか直接体感できますね。人に聞くよりも。

johnsmith_
質問者

お礼

環境による違いもあるかもしれないと思って聞いてみました。 windowsならどれも同じみたいですね。 ありがとうございました。