在C中释放动态分配的2D数组

时间:2018-03-22 15:10:22

标签: c heap-memory dynamic-allocation

我有这段代码:

#include<stdio.h>
#include<stdlib.h>

int main()
{
    int ** ar;
    int i;
    ar = malloc( 2 * sizeof(int*));

    for(i=0; i<2; i++)
        ar[i] = malloc ( 3 * sizeof(int) );

    ar[0][0]=1;
    ar[0][1]=2;
    ar[0][2]=5;
    ar[1][0]=3;
    ar[1][1]=4;
    ar[1][2]=6;

    for(i=0; i<2; i++)
        free(ar[i]);

    free(ar);
    printf("%d" , ar[1][2]);

    return 0;
}

我在这个主题上经历了一些主题 (how to free c 2d array) 但他们已经很老了,没有人活跃。

我对代码有以下疑问:

  1. 这是在C中为二维数组释放内存的正确方法吗?

  2. 如果这是正确的方法,那么为什么我在尝试打印时仍然会获得相应的数组值?这是否意味着内存没有正确释放?

  3. 内存释放后会发生什么?我存储的所有值是否都会被删除,或者它们只是留在等待重新分配的内存中?

  4. 是否需要这种未定义的行为?

1 个答案:

答案 0 :(得分:1)

是的,你有两个级别或层(可以这么说)的内存可以免费。

内存分配(我喜欢你先做的那些)

最顶层的int **指针的外部内存分配。

即使你释放了内存,也没有用它来覆盖它(所以它是预期的)。因此,为什么你仍然可以将它们打印到控制台。完成它们后,总是将指针置为NULL是一个好主意。有礼貌的事情要做。我在过去修复了许多错误和崩溃,因为代码在释放后没有使指针无效。

在Microsofts Visual Studio中,使用Debug C运行时,它可以使用一些垃圾覆盖新释放的值,如果使用或解除引用,将立即引发访问冲突。这对于清除错误很有用。

看起来你是C的新手(学生?)。欢迎并度过愉快的时光。