- ベストアンサー
ポインタに文字列を代入した場合、メモリはいつ開放されるか。
C言語で、 char *p = "abcd"; の様にポインタに文字列を代入した場合'a','b','c','d','\0'が格納されているメモリ領域はいつ開放されるのでしょうか。 また、このような文字列は、 *(p + 2) = 'f'; というふうに後から一部の値を変更することはできるのでしょうか。 的外れな質問かもしれませんがよろしくお願いします。
- みんなの回答 (3)
- 専門家の回答
質問者が選んだベストアンサー
環境にもよりますが、一般的な「windows+vc」で話をさせていただきます。 "abcd"はデータセグメントの領域に格納され、プログラムの起動から終了までメモリ上に置かれたままとなります。 データセグメントの領域は書換不可領域のため、アクセス違反でエラーとなります。
その他の回答 (2)
- Tacosan
- ベストアンサー率23% (3656/15482)
char *p = "abcd"; *(p+2) = 'f'; は「未定義動作」だから何が起きても文句はいえない. 普通は「何事もなかったかのように動く」か「実行時エラーになる」のどちらかだが, 実際にはどうなるかわからない. 例えば, #include <stdio.h> int main() { char *p = "abcd"; *(p+2) = 'f'; printf("%s\n", "abcd"); return 0; } とやったときに「abfd」と表示されるかもしれない. あるいは, いきなり鼻歌を歌い出すかも.
お礼
つまり、後からの変更はやらない方がいいということですね。 参考になりました。
- asuncion
- ベストアンサー率33% (2127/6289)
後から一部を書き換えるようなコードを書いてみると、 どういう結果を得るか直接体感できますね。人に聞くよりも。
お礼
環境による違いもあるかもしれないと思って聞いてみました。 windowsならどれも同じみたいですね。 ありがとうございました。
お礼
ありがとうございます。 入門書などには書かれていなかったので気になっていました。