CでポインタからNULLへのメモリを再割り当てすることは可能ですか?
int *v = 0;
for(i = 0; i < 10; i++)
v = (int *) realloc(v, (i+1)*sizeof(int));
「ptr が NULL の場合、関数は malloc とまったく同じように動作し、size バイトの新しいブロックを割り当て、その先頭へのポインターを返します。」
http://www.cplusplus.com/reference/clibrary/cstdlib/realloc/
ちなみに、このコードは質問のためだけのものであることは知っていますが、ポインタを更新する前に常に realloc の戻り値を確認する必要があります:
int *p,*tmp;
tmp = (int *)realloc(p, nBytes);
if(tmp){
p = tmp;
}
else{
//Out of memory!
}
そうしないと、再割り当てが失敗したときに、割り当てられたメモリへの参照が失われます。
ptr が NULL の場合、size のすべての値について、呼び出しは malloc(size) と同等です。
ソース: man 3 realloc
スタンダードから
7.20.3.4/3 ... ptr が null ポインターの場合、realloc 関数は、指定されたサイズの malloc 関数のように動作します。
マンページから:
ptr が NULL の場合、呼び出しは malloc(size); と同等です。size が 0 の場合、呼び出しは free(ptr) と同等です。ptr が NULL でない限り、malloc()、calloc()、または realloc() への以前の呼び出しによって返されたに違いありません。
ただし、メモリのサイズを変更できない場合は NULLを返すrealloc()
可能性があることを忘れないでください。あなたが投稿したコードは、これが発生した場合、複数のメモリ ブロックが割り当てられる可能性があります。これは、NULL の戻り値がフィードバックされ、新しいブロックが割り当てられるためです。(とにかく、そのコードを実際に使用していないことを願っています...)realloc()
reallocのマニュアルページから:
realloc() は、ptr が指すメモリー・ブロックのサイズを size バイトに変更します。コンテンツは、古いサイズと新しいサイズの最小値に変更されません。新しく割り当てられたメモリは初期化されません。ptr が NULL の場合、呼び出しは malloc(size); と同等です。size が 0 の場合、呼び出しは free(ptr) と同等です。ptr が NULL でない限り、malloc()、calloc()、または realloc() への以前の呼び出しによって返されたに違いありません。指している領域が移動された場合、free(ptr) が実行されます。