首页 > 解决方案 > memset() 3D 数组中的错误

问题描述

我动态分配一个 3D 数组:

int n1=2,n2=5,n3=3;
int in1,in2,in3;
float ***a;
a = (float ***)malloc(n1*sizeof(float **));
for (in1=0;in1<n1;in1++)
    a[in1] = (float **)malloc(n2*sizeof(float *));
for (in1=0;in1<n1;in1++)
    for (in2=0;in2<n2;in2++)
        a[in1][in2] = (float *)malloc(n3*sizeof(float));

之后我想初始化这个 3D 数组。常规方式是:

for (in1=0; in1<n1; in1++)            
    for (in2=0; in2<n2; in2++)      
        for (in3=0; in3<n3; in3++)  
            a[in1][in2][in3] = 1.0f;

但是,如果我想用memset()它来初始化数组,这似乎不可行,因为第一个输入是*ptr。所以如果我写

memset(a[0],1,n1*n2*n3*sizeof(float));

第一个输入a[0]是一个**ptr,这是错误的。如果我写:

memset(a[0][0],1,n2*n3*sizeof(float));

第一个输入是 *ptr,但不再有 n1 维。

所以我想知道是否memset()只能用于初始化二维矩阵?

** 我知道 memset 不能用于 3D 数组,但对于 2D 数组我认为是可行的。这是一个例子:

int n1=2,n2=5;
int in1,in2;
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);

这也不是连续内存?但它可以得到正确的结果。

标签: cmemset

解决方案


您的“3d 数组”实际上并不是memset预期的数组数组。如果我们把它画出来,它看起来像这样:

     +-----+------+-----+------------+
一个-> | 一个[0] | 一个[1] | ... | 一个[n1 - 1] |
     +-----+------+-----+------------+
             |
             v
             +---------+---------+------+--------------+
             | 一个[1][0] | 一个[1][1] | ... | 一个[1][n2 - 1] |
             +---------+---------+------+--------------+
              |
              v
             +------------+------------+------+------ +
             | 一个[1][0][0] | 一个[1][0][1] | ... | 一个[1][0][n3 - 1] |
             +------------+------------+------+------ +

这种布局也称为锯齿状阵列。但无论它叫什么,您的memset调用都希望您写入的内存是连续的,而您的“3D 数组”不是

简而言之,你不能用它memset来初始化你的数组。


一些方法可以让它成为一个连续的内存区域,但是你不能再真正使用漂亮的数组索引,而是必须使用算术来计算每个索引。


推荐阅读