0

Cでは、このようなcharポインタを宣言します

char* p="Hello";

文字列リテラルにメモリを割り当てますHello\0。後でこれをするとき

p="FTW";

割り当てられたメモリはどうなりHello\0ますか?アドレスpポイントは変更されていますか?

4

6 に答える 6

10

どちらのステートメントにも動的メモリ割り当てはありません。

これらの文字列は実行可能ファイルに保存され、プロセスが存続する限り存続するメモリの(読み取り専用の可能性が高い)セクションにロードされます。

2番目の割り当ては、pポイントを変更するだけです。他には何も起こりません。

于 2012-05-16T07:47:44.533 に答える
0

メモリはによって占有されたまま"Hello"です。それは失われます(他の参照がない限り)。

pを指しているアドレス(の値p)はもちろん変更されます。

于 2012-05-16T07:48:20.573 に答える
0

この場合、「Hello」はコンパイル時に作成され、バイナリの一部です。ほとんどの場合、「Hello」は読み取り専用メモリに保存されます。「FTW」もバイナリの一部です。2番目の割り当ては、ポインターのみを変更します。

于 2012-05-16T07:48:41.433 に答える
0

さらに"Hello""FTW"Metが指摘したように、静的なストルゲー期間があります

于 2012-05-16T07:49:55.307 に答える
0

変更できない文字列定数を作成するため、そのまま使用する必要があります。

やってみたら

p[0]='m';

これは、値を再割り当てして読み戻すことができるメモリが割り当てられた文字列リテラルではないため、セグメンテーション違反が発生します。

于 2012-05-16T10:03:07.407 に答える
-1

仮に

p = getbuffer();

getbuffer()
{
   return buf = malloc(buf, size);
}

新しいメモリをpに割り当てる前に、このメモリを解放するにはどうすればよいですか。pがgetbuffer()を何度も使用する必要があると想像してください。

于 2014-08-17T07:08:34.037 に答える