int main( )
{
int *p;
p=(int *)malloc(20);
printf("%u",p); \\ printing some memory adress
p=(int *)realloc(p,0);
printf("%u",p); \\ printing as 0
printf("%u",*p); \\ printing the value as 0
}
Run Code Online (Sandbox Code Playgroud)
现在我的问题是relloc作为free()函数的语句,因为指针p指向它中的NULL和NULL值.这20个字节会被释放吗?
不,在任何情况下都可能无法释放.C99有这样的说法7.20.3.4 The realloc function:
如果无法分配新对象的内存,则不会释放旧对象,并且其值不会更改.
现在您可能认为零字节的分配不可能失败,但标准并未强制要求.它说,对于零大小的对象:
如果请求的空间大小为零,则行为是实现定义的:返回空指针,或者行为就像大小是非零值一样,除了返回的指针不应用于访问宾语.
所以,如果你的实现是那些之一并不为大小为零的分配返回NULL,它需要一些针对每个分配内务信息,和存储领域是如此充满你不能存储甚至是另一个看家头,仅仅分割当前的分配并将其大部分返回到竞技场并不够智能,它可能会失败为零realloc,因此不会释放原始内存.
现在这是一个(非常)边缘的情况,取决于在实现中做出的许多决定,其中大多数对于具有编写经验的人来说可能看起来很奇怪.不幸的是,我们也必须考虑边缘情况:-)
如果真的让你担心,我只会改变:
p=(int *)realloc(p,0);
Run Code Online (Sandbox Code Playgroud)
成:
free (p) ; p = NULL;
Run Code Online (Sandbox Code Playgroud)
其他几点.
/,而不是反斜杠.p在最后一行中不允许取消引用,无论您的实现是否为零大小分配返回NULL.请参阅上面的第二个引用,其中指出:"除了返回的指针不应用于访问对象之外".malloc-type调用转换返回值.这是C之前昏暗的黑暗过去的宿醉void*,并malloc返回char*.现在这样做的问题是,如果您忘记包含stdlib.h,可能会向您隐藏问题.