关于realloc功能的困惑

Jay*_*esh 4 c realloc language-lawyer

我使用参考读了C中的动态内存分配.

那个文件Say's:

realloc()只应用于动态分配的内存.如果未动态分配内存,则行为未定义.

如果我们使用realloc()这样的东西:

int main()
{
    int *ptr;
    int *ptr_new = (int *)realloc(ptr, sizeof(int));

    return 0;
}
Run Code Online (Sandbox Code Playgroud)

根据该引用,该程序未定义,因为指针ptr未动态分配.

但是,如果我使用类似的东西:

int main()
{
    int *ptr = NULL;
    int *ptr_new = (int *)realloc(ptr, sizeof(int));

    return 0;
}
Run Code Online (Sandbox Code Playgroud)

根据该参考,它是否也是未定义的行为?

我的第二种情况不会调用未定义的行为.我对吗?

Sto*_*ica 10

第一种情况有未定义的行为,第二种情况没有.在第一种情况下,值ptr是不确定的.因此,将该值传递给realloc任何函数,本身是不确定的.

另一方面,由于realloc在传递空指针值(它就像调用malloc)1时具有明确定义的行为,因此第二段代码是完全合法的(除了事实上你没有free任何东西).


1 7.22.3.5 realloc函数/ p3

如果ptr是空指针,则realloc函数的行为类似于指定大小的malloc函数.