Cでは、このようなcharポインタを宣言します
char* p="Hello";
文字列リテラルにメモリを割り当てますHello\0
。後でこれをするとき
p="FTW";
割り当てられたメモリはどうなりHello\0
ますか?アドレスpポイントは変更されていますか?
Cでは、このようなcharポインタを宣言します
char* p="Hello";
文字列リテラルにメモリを割り当てますHello\0
。後でこれをするとき
p="FTW";
割り当てられたメモリはどうなりHello\0
ますか?アドレスpポイントは変更されていますか?
どちらのステートメントにも動的メモリ割り当てはありません。
これらの文字列は実行可能ファイルに保存され、プロセスが存続する限り存続するメモリの(読み取り専用の可能性が高い)セクションにロードされます。
2番目の割り当ては、p
ポイントを変更するだけです。他には何も起こりません。
メモリはによって占有されたまま"Hello"
です。それは失われます(他の参照がない限り)。
p
を指しているアドレス(の値p
)はもちろん変更されます。
この場合、「Hello」はコンパイル時に作成され、バイナリの一部です。ほとんどの場合、「Hello」は読み取り専用メモリに保存されます。「FTW」もバイナリの一部です。2番目の割り当ては、ポインターのみを変更します。
さらに"Hello"
、"FTW"
Metが指摘したように、静的なストルゲー期間があります
変更できない文字列定数を作成するため、そのまま使用する必要があります。
やってみたら
p[0]='m';
これは、値を再割り当てして読み戻すことができるメモリが割り当てられた文字列リテラルではないため、セグメンテーション違反が発生します。
仮に
p = getbuffer();
getbuffer()
{
return buf = malloc(buf, size);
}
新しいメモリをpに割り当てる前に、このメモリを解放するにはどうすればよいですか。pがgetbuffer()を何度も使用する必要があると想像してください。