-1

私は、次のものがあればそれを理解しています:

char* c1 = "apple";
char* c2 = "apple";

次に、これら 2 つの char* がまったく同じメモリ アドレスを持つことができます。しかし、次の場合はどうでしょうか。

char* c1 = (char*)malloc(sizeof(char)*10);
memset(c1, 0, 10);
c1[0]='a';c1[0]='p';c1[0]='p';c1[0]='l';c1[0]='e';
char* c2 = (char*)malloc(sizeof(char)*10);
memset(c1, 0, 10);
c2[0]='a';c2[0]='p';c2[0]='p';c2[0]='l';c2[0]='e';

この場合でも c1 と c2 が同じアドレスを持っている可能性はありますか?

4

4 に答える 4

7

c1実際には、とc2が両方とも文字列リテラルへのポインターである最初の状況では:

char* c1 = "apple";
char* c2 = "apple";

c1c2が同じ値を持つかどうかは規定されていません。言い換えれば、それらは同じアドレスを持っているかもしれませんし、持っていないかもしれません。


2 番目の状況で、c1c2が同じ値を持つ唯一の可能性は、両方の呼び出しがmalloc失敗した場合です。この場合、両方とも null ポインターです。それ以外の場合、それらは異なる値になります。

これが、 の戻り値を確認する必要がある理由ですmalloc

于 2013-11-09T16:39:15.847 に答える
5

c1malloc は、とに対して一意のアドレスまたは NULL を返すc2ため、両方で malloc が失敗しない限り、値は異なります。NULL の場合を除いて、malloc が魔法のように同じ値になるものに対して同じアドレスを返す方法はありません。

ただし、次のように言うこともできます。

c2 = c1;

c2はメモリ内の と同じ場所を参照しますc1

于 2013-11-09T16:38:04.290 に答える
1

この場合でも c1 と c2 が同じアドレスを持っている可能性はありますか?

いいえ。

malloc()呼び出しごとにメモリ ブロックを割り当てます。

あなたがmalloc()連続して電話をかけた場合、それらの 2 つのアドレスは異なります。

于 2013-11-09T16:39:34.493 に答える
1

いいえ、できません*。メモリが割り当てられるたびに、メモリの「空き」リストから取り出されます。それ以降の malloc の呼び出しでは、「空き」リストからのみメモリを予約できます。

しかし、あなたが置くとき

char *c1 = "apple"

「apple」は、プロセス全体用に予約されたメモリの静的部分に配置されます。
その後、「apple」と同じメモリアドレスを char *c2 に与えるかどうかは、コンパイラに依存します。

あってはならないことであり、間違っています。しかし、標準の C/C++ のコンテキストから、そしておそらく他のプログラミング言語について言えば、それを行うためにコンパイラー (他のプログラムと同様のプログラム) を止めるものは何もありません。

于 2013-11-09T16:43:00.700 に答える