关于2D数组的`memset`的混淆和'free`的错误

时间:2018-06-05 19:24:02

标签: c free memset

我使用malloc动态分配内存,使用memset初始化2D数组,并使用free释放内存。代码是:

int n1=2,n2=5;
int in1;
float **a;
a = (float **)malloc(n1*sizeof(float *));
for (in1=0;in1<n1;in1++)
    a[in1] = (float *)malloc(n2*sizeof(float));
memset(a[0],0,n1*n2*sizeof(float));
free(*a);free(a);

运行代码时的第一个问题是:      *。./try1&#39;:free()出错:下一个大小无效(快):0x0000000000c06030 *

第二个问题是:因为使用memset的先决条件是具有连续的内存。这就是为什么它不能处理3D阵列的原因(参见Error in memset() a 3D array)。但是这里a是一个2D指针或数组,memset的输入是a[0]。我的理解是:

  +---------+---------+-----+--------------+
  | a[0][0] | a[0][1] | ... | a[0][n2 - 1] |
  +---------+---------+-----+--------------+
    ^
    |
 +------+------+-----+-----------+
 | a[0] | a[1] | ... | a[n1 - 1] |
 +------+------+-----+-----------+
           |
           v
         +---------+---------+-----+--------------+
         | a[1][0] | a[1][1] | ... | a[1][n2 - 1] |
         +---------+---------+-----+--------------+

上图显示了连续的内存。因此memset(a[0],0,n1*n2*sizeof(float));可以成功初始化**a。我对吗?如果它不连续,初始化如何成功? (它来自经过测试的开源代码)

1 个答案:

答案 0 :(得分:0)

  

上图显示了连续的记忆。

不,它没有。它显示了两个连续记忆区域:a [0] [0] - &gt; a [0] [n2-1]和[1] [0] - &gt; a [1] [n2 - 1]。

你可以尝试初始化并删除它们中的每一个:

int n1 = 2, n2 = 5;
int in1;
float **a;
a = (float **)malloc(n1*sizeof(float *));
for (in1 = 0; in1<n1; in1++)
{ 
    a[in1] = (float *)malloc(n2*sizeof(float));
    memset(a[in1], 0, n2*sizeof(float));
}
for (in1 = 0; in1<n1; in1++)
{
    free(*(a+in1));
}
free(a);

仅限于真实&#39; 2d数组,如float a[2][5];,你对连续内存的假设是正确的。