以下代码是否释放了为x
分配的内存?
int main()
{
char *x = (char*)calloc(100, sizeof(char));
char *y = x;
free(y);
}
答案 0 :(得分:18)
是强>
当你这样做时
char *y = x;
您将y
指向x
指向的位置。由于y
指向calloc
返回的内存位置,
free(y);
完全有效。如@haccks commented,如果您将y
指向另一个内存位置,则此操作无效,前提是malloc
/ {{未返回此内存位置1}} / calloc
。
在C中,你是should not cast the result of malloc
/calloc
/realloc
。此外,检查realloc
的返回值以查看它是否成功是好的。 <{1}}将在失败时返回calloc
。
答案 1 :(得分:5)
问题的原始版本
int *y = x;
free(y);
即。将char
指针分配给int
指针,然后在free()
指针上调用int
。 free()
的签名为void free(void *ptr);
,因此无论char *
与int *
如何,都会释放内存。
问题的编辑(和当前)版本
char *y = x;
free(y);
此处,y
和x
都指向同一个内存。这称为指针别名。在调用free()
后,该内存肯定会被释放。
然而,问题是在free(y)
之后,指针x
将悬空,即它指向的内存不再有效。
注意,既没有必要也没有建议从calloc
转换返回值。
答案 2 :(得分:1)
是的,确实如此。
该方法为void free(void *ptr)
,然后当您创建char* y = x
时,您有一个指向y
所指向的相同空间内存的指针。
这可以让您稍后使用free (y)
释放该空间。
但是,你会放x = NULL
,因为现在x
没有自己的空间,尽管它有值。
有关免费阅读here的更多信息。
答案 3 :(得分:0)
您SaveAs
来电所回复的内存已通过calloc()
的通话释放。
在影响free()
和x
的代码中。