免费()后打印数组时应用程序崩溃

时间:2013-04-10 10:13:26

标签: c malloc

为什么在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 的新手。

请告诉我有什么问题。

3 个答案:

答案 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指针。