我一直在教自己如何用C编写代码,并且已经成功编写了一个大小合适的程序。我在编译或执行程序时没有问题,但是我有点担心关于数组数据类型的内存分配的次要细节。
我以以下方式为数组动态分配内存:
double **array=malloc(n*sizeof(*array));
for(i=0; i<n; i++){
array[i]=malloc(3*sizeof(*(array[i])));
}
这对于构造nx3数组非常有效,对此我感到很高兴。但是,我从先前的许多问答中了解到,您不仅需要释放数组本身,还需要释放数组中的每个元素。为什么我无法释放元素?当我这样做时:
for(i=0; i<n; i++){
free(array[i]);
}
free(array);
循环导致内存损坏。当我删除循环并简单地释放数组时,没有分段错误或损坏,并且运行平稳。有人可以向我解释一下吗?我不了解在这种情况下释放指针与变量的原理吗?
谢谢,最好的问候,迈克
这是一个MCVE(如何创建一个最小,完整和可验证的示例?)或SSCCE(简短,自包含,正确的示例)(两个名称和相同思想的链接),它们非常紧密地基于您的代码:
#include <stdlib.h>
int main(void)
{
int i;
int n = 20;
double **array = malloc(n * sizeof(*array));
for (i = 0; i < n; i++)
{
array[i] = malloc(3 * sizeof(*(array[i])));
}
for (int x = 0; x < n; x++)
for (int y = 0; y < 3; y++)
array[x][y] = 0.0;
for (i = 0; i < n; i++)
{
free(array[i]);
}
free(array);
return 0;
}
在Mac OS X 10.9.5上使用GCC 4.9.1编译并在valgrind
3.10.0下运行时,它将产生干净的运行状况清单:
==7957== Memcheck, a memory error detector
==7957== Copyright (C) 2002-2013, and GNU GPL'd, by Julian Seward et al.
==7957== Using Valgrind-3.10.0.SVN and LibVEX; rerun with -h for copyright info
==7957== Command: mma
==7957==
==7957==
==7957== HEAP SUMMARY:
==7957== in use at exit: 25,245 bytes in 373 blocks
==7957== total heap usage: 470 allocs, 97 frees, 31,829 bytes allocated
==7957==
==7957== LEAK SUMMARY:
==7957== definitely lost: 0 bytes in 0 blocks
==7957== indirectly lost: 0 bytes in 0 blocks
==7957== possibly lost: 0 bytes in 0 blocks
==7957== still reachable: 0 bytes in 0 blocks
==7957== suppressed: 25,245 bytes in 373 blocks
==7957==
==7957== For counts of detected and suppressed errors, rerun with: -v
==7957== ERROR SUMMARY: 0 errors from 0 contexts (suppressed: 0 from 0)
(Mac OS X运行时库总是有很多内存分配。)
这强烈表明问题不在于内存分配或释放代码,而在于(错误)使用内存的代码。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句