为什么在printf()
之后尝试free()
时会崩溃?
我创建了dyanmic数组。显示的元素。用价值填充每个元素。然后使用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;
}
P.S。我是 C 的新手。
请告诉我有什么问题。
答案 0 :(得分:4)
因为您引用了指向NULL
的内存。
这实际上是未定义的行为,因此可能工作,但解除引用NULL
指针很可能会导致崩溃。
即使你没有将指针设置为NULL
,它仍然是未定义的行为以引用未分配的内存,虽然它很可能不会崩溃,但它仍然是一件坏事。
答案 1 :(得分:2)
当你free
任何记忆时,它就消失了。你不能再使用它了。
完成后你应该free
。
释放后,您正在使用指针p
。系统假定您释放后不需要内存。所以它不会为你保留它。如果内存仍未使用,它可能会工作一些时间。但是在这种情况下,您将NULL
分配给指针p
,然后尝试打印那里存在的值,这绝对不会起作用。
答案 2 :(得分:1)
总有一件事需要记住。释放的内存可以返回预期的结果(有时会这样)。我也有时会遇到这个问题。你可以在这里找到有用的见解:
Can a local variable's memory be accessed outside its scope?
现在来看你的代码:
free(p);
在这里你可能得到你想要的东西..但你不保证,并且不允许使用它。这是未定义的行为。但现在
p = NULL;
会破坏你的程序。因为指针现在指向NULL,并且不允许取消引用NULL指针。如果您实际上不需要它,请不要指向NULL。永远不要取消引用NULL指针。