为什么在free()
之后尝试printf()
时会崩溃?
我已经创建了动态数组。显示元素。用值填充每个元素。然后使用free()
释放内存。然后尝试再次显示元素
代码如下:
#include <stdio.h>
#include <stdlib.h>
int main()
{
int i;
int *p;
p = (int *)malloc(10 * sizeof(int));
for ( i = 0; i < 10; i++ )
printf("%d ", p[i]);
printf("n");
for ( i = 0; i < 10; i++ )
p[i] = i;
for ( i = 0; i < 10; i++ )
printf("%d ", p[i]);
printf("n");
free(p);
p = NULL;
for ( i = 0; i < 10; i++ ) /* App crashes around here. */
printf("%d ", p[i]);
printf("n");
return 0;
}
注:我是新来的C。
因为您引用内存指向NULL
。
这实际上是未定义的行为所以它可能工作,但是解引用一个NULL
指针很可能会导致崩溃。
即使你没有将指针设置为NULL
,它仍然是未定义的行为,去引用未分配的内存,虽然它很可能不会崩溃,但它仍然是一个不好的事情。
当你free
任何记忆时,它就消失了。你不能再用它了。
你应该在完成它之后free
。
在释放指针p
之后,您正在使用它。系统假定释放内存后不再需要它。所以它不会为你保留它。如果内存仍然未使用,它有时可能会工作。但是在这种情况下,您将NULL
分配给指针p
,然后尝试打印那里存在的值,这绝对不会工作。
有一件事要永远记住…释放的内存可以返回预期的结果(有时确实如此)。我有时也会遇到这个问题。你可以在这里找到有用的见解:
局部变量的内存可以在其作用域之外访问吗?
现在来看你的代码:
free(p);
在这里你可以得到你想要的东西…但你不能保证,你不允许使用这个。这是未定义的行为。但是现在
p = NULL;
是导致程序崩溃的东西。因为指针现在指向NULL,并且不允许取消对NULL指针的引用。如果您实际上不需要它,不要指向NULL。永远不要取消NULL指针的引用。