应用程序在free()之后打印数组时崩溃



为什么在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指针的引用。

相关内容

  • 没有找到相关文章

最新更新