我有这段代码:
#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) 但他们已经很老了,没有人活跃。
我对代码有以下疑问:
这是在C中为二维数组释放内存的正确方法吗?
如果这是正确的方法,那么为什么我在尝试打印时仍然会获得相应的数组值?这是否意味着内存没有正确释放?
内存释放后会发生什么?我存储的所有值是否都会被删除,或者它们只是留在等待重新分配的内存中?
是否需要这种未定义的行为?
答案 0 :(得分:1)
是的,你有两个级别或层(可以这么说)的内存可以免费。
内存分配(我喜欢你先做的那些)
最顶层的int **指针的外部内存分配。
即使你释放了内存,也没有用它来覆盖它(所以它是预期的)。因此,为什么你仍然可以将它们打印到控制台。完成它们后,总是将指针置为NULL是一个好主意。有礼貌的事情要做。我在过去修复了许多错误和崩溃,因为代码在释放后没有使指针无效。
在Microsofts Visual Studio中,使用Debug C运行时,它可以使用一些垃圾覆盖新释放的值,如果使用或解除引用,将立即引发访问冲突。这对于清除错误很有用。
看起来你是C的新手(学生?)。欢迎并度过愉快的时光。