2017-02-17 6 views
4

ビヘイビアーの実装は定義されていますか? NULLとサイズ== 0がrealloc()に渡された場合:NULLとサイズ0がrealloc()に渡されるとどうなりますか?

int main(void) 
{ 
    int *ptr = NULL; 

    ptr = realloc(ptr, 0); 

    if(ptr == NULL) 
    { 
     printf("realloc fails.\n"); 
     goto Exit; 
    } 

    printf("Happy Scenario.\n"); 

Exit: 
    printf("Inside goto.\n"); 

return 0; 
} 

上記のコードは右、 "reallocのに失敗した" 印刷する必要がありますか?そうではありません?私はreallocへのこの呼び出しがNULLも返す可能性があると読んだところです。それはいつですか?

+0

[Realloc on NULL値(または未定義)ポインター]の可能な複製](http://stackoverflow.com/questions/12134315/realloc-on-null-valued-or-undefined-pointer) –

+1

可能な重複はありません'void * vp = realloc(NULL、0);'の動作の特定のポイントに対処していません。 –

+0

私はここで@Jonathanに同意します。引用されたdupには0要素のrealloc'ingの振る舞いと戻ってくるポインタに関する情報がないと思われます。古いMicrosoftプラットフォームでは、0個の要素を割り当てるときに問題がありました。 – jww

答えて

7

この動作は実装定義です。 C standardから

第7.22.3.5(realloc):

ptrがヌルポインタである場合、realloc関数は、指定されたサイズのためにmalloc関数のように振る舞います。は、そうでない場合ptr がポインタと一致しない場合、以前のメモリ管理 関数によって返された、またはスペースが への呼び出しによってfreeまたはrealloc機能を割り当て解除された場合、動作は未定義です。 新しいオブジェクトのメモリを割り当てることができない場合、古いオブジェクトは であり、その値は変更されていません。私たちは、セクション7.22.3を見れば

のでrealloc(NULL, 0)malloc(0)

と同じです。4(malloc):

malloc関数は、そのサイズsizeで指定し、その値は不定であるオブジェクトのためのスペースを割り当てます。

malloc関数は、NULLポインタまたは割り当てられた領域へのポインタを返します。

標準は0が渡されたときに何が起こるか状態しません

しかし、あなたは、Linux man page見れば:。

malloc()関数はsizeバイトを割り当て、 へのポインタを返します割り当てられたメモリメモリが初期化されていません。 サイズが0の場合、 を返します。malloc()は、NULLまたは が後でに正常に渡される唯一のポインタ値を返します。

明示的には、返された値を解放することができますが、必ずしもNULLであるとは限りません。

は対照的に、MSDN言う:

サイズが0の場合は、malloc関数は、ヒープ内の長さゼロの項目を割り当て、 は、その項目への有効なポインタを返します。要求されたメモリ量が少ない場合でも、常に mallocからの戻り値を確認してください。

MSVCの場合、NULLポインタは取得されません。

+0

ありがとう!それはMSDNとのコントラストという点では役に立ちました。 – user7375520

11

のrealloc(3)DOC:

ptrがNULLの場合、呼び出しは、サイズのすべての値について、malloc関数(サイズ)に相当する

のmalloc(3)DOC:

sizeが0の場合、malloc()はNULLか、後で成功(完全にfree()に渡すことができる一意のポインタ値)を返します。

はい、実装定義されているので、nullまたはポインタを空けることができます。

+2

ヌル以外のポインタを取得した場合は、リークを避けるためにポインタを解放する必要がありますが、逆参照できません(正当にアクセス可能なメモリが0バイトあるため)。 –

+0

@JonathanLeffler "...リークを避けるためにあなたが得たポインタは解放されるべきです"は、NULLを返さない0または非ゼロサイズで割り当てられたすべてのポインタに適用されます。結局、彼らは漏れを避けるために自由にするべきです。 OTOH、 'malloc(0)'が 'NULL'以外のものを返した場合、すぐに解放するとメモリー使用量が減るかもしれませんが、良いアイデアかもしれませんが、_leak_問題ではありません。 – chux

6

コール

realloc(NULL, size); 

malloc(size); 

に相当し、malloc()は、標準では何を言っていないビットは不明である0バイトを割り当てるように要求された場合にはありません。私はそれが実装定義のものだと思う。基本的には「問題ではない」。 NULLを返します。または、合法的に0バイトにアクセスできるポインタを返します。これらのポインタはほぼ同じです。どちらもfree()に渡すことができます。

関連する問題