このコードが機能しないのはなぜですか?
char *x=malloc(100);
x++;
x=realloc(x, 200);
つまり、x は有効な文字列ポインタで、1 だけインクリメントされますか?
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
によって返されました。したがって、プログラムは未定義の動作を呼び出します。malloc
x + 1
何をするかを考えてくださいrealloc
。実際にfree
アドレスにポインターを作成したx+1
ときに、どうすればアドレスにポインターを作成できますか?malloc
x
より具体的には、アドレス 0x1000 に 100 バイトを割り当てたとします。現在x
はインクリメントされ、0x1001 を指しています。次にrealloc
、新しい住所に電話します。malloc
、calloc
、およびrealloc
作成された 0x1001 free
(または同等のコード)のいずれもへの呼び出しで使用されrealloc
ていないため、0x1001 で何かを行う方法がわかりません。占有するメモリのバイト数を推測することさえできません。0x1000 の 100 バイトしか認識していません。
との実装の背後にある基本的な考え方malloc
は、割り当てられたポインターと割り当てられたバイト数を追跡することです。その後、free
が呼び出されると、 に渡されたポインタfree
が検索されます。に渡されたポインタへの参照がない場合free
、クラッシュ以外に何をする必要がありますか? 私にとって、それは有効かもしれないし無効かもしれないポインタを使い続けることができると仮定するよりも論理的です。
これは、間違っundefined behavior
たポインターを取得したと思われる場合のエラーです。malloc()
によって明らかx
に返されmalloc
、その値は呼び出す前に変更されたため、未定義の動作realloc()
を示しています。