4

このコードが機能しないのはなぜですか?

char *x=malloc(100);
x++;
x=realloc(x, 200);

つまり、x は有効な文字列ポインタで、1 だけインクリメントされますか?

4

4 に答える 4

7

C Standard (C99, 7.20.3.4p3)reallocと私の強調を参照してください。

void *realloc(void *ptr, size_t サイズ);

ptr がヌル ポインターの場合、realloc 関数は、指定されたサイズに対して malloc 関数のように動作します。それ以外の場合、ptr が calloc、malloc、または realloc 関数によって以前に返されたポインターと一致しない場合、または free または realloc 関数の呼び出しによってスペースが解放された場合、動作は undefinedです。

あなたの場合、 ではなくxによって返されました。したがって、プログラムは未定義の動作を呼び出します。mallocx + 1

于 2013-09-15T14:59:17.027 に答える
2

何をするかを考えてくださいrealloc。実際にfreeアドレスにポインターを作成したx+1ときに、どうすればアドレスにポインターを作成できますか?mallocx

より具体的には、アドレス 0x1000 に 100 バイトを割り当てたとします。現在xはインクリメントされ、0x1001 を指しています。次にrealloc、新しい住所に電話します。malloccalloc、およびrealloc作成された 0x1001 free(または同等のコード)のいずれもへの呼び出しで使用されreallocていないため、0x1001 で何かを行う方法がわかりません。占有するメモリのバイト数を推測することさえできません。0x1000 の 100 バイトしか認識していません。

との実装の背後にある基本的な考え方mallocは、割り当てられたポインターと割り当てられたバイト数を追跡​​することです。その後、freeが呼び出されると、 に渡されたポインタfreeが検索されます。に渡されたポインタへの参照がない場合free、クラッシュ以外に何をする必要がありますか? 私にとって、それは有効かもしれないし無効かもしれないポインタを使い続けることができると仮定するよりも論理的です。

于 2013-09-15T15:18:41.073 に答える
1

これは、間違っundefined behaviorたポインターを取得したと思われる場合のエラーです。malloc()

によって明らかxに返されmalloc、その値は呼び出す前に変更されたため、未定義の動作realloc()を示しています。

于 2013-09-15T15:00:15.623 に答える