0

为什么在尝试printf()之后会崩溃free()

我创建了动态数组。显示的元素。用值填充每个元素。然后使用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;
}

PS我是新来的C

请让我知道有什么问题。

4

3 回答 3

4

因为您引用的内存指向NULL.

这实际上是未定义的行为,因此它可能会起作用,但取消引用NULL指针很可能会导致崩溃。


即使您没有将指针设置为NULL它仍然是取消引用未分配内存的未定义行为,尽管它很可能不会崩溃,但这仍然是一件坏事。

于 2013-04-10T10:14:40.460 回答
2

当你free有任何记忆时,它就消失了。你不能再使用它了。

你应该free在你完成它之后。

p释放指针后,您正在使用它。一旦释放内存,系统就会假定您不需要内存。所以它不会为你保留它。如果内存仍未使用,它可能会工作一段时间。但是在这种情况下,您将分配NULL给指针p,然后尝试打印那里存在的值,这绝对行不通。

于 2013-04-10T10:15:42.910 回答
1

永远要记住的一件事..释放的内存可以返回预期的结果(有时确实如此)。我有时也会遇到这个问题。你可以在这里找到有用的见解:

可以在其范围之外访问局部变量的内存吗?

现在来到你的代码:

free(p);

在这里,您可能会得到您期望的东西..但您不能保证并且不允许使用它。这是未定义的行为。但现在

p = NULL;

是使您的程序崩溃的东西。因为指针现在指向 NULL,并且不允许取消引用 NULL 指针。如果您实际上不需要它,请不要指向 NULL。并且永远不要取消引用 NULL 指针。

于 2013-04-10T10:31:38.387 回答