gpt4 book ai didi

c - memset() 中的错误 3D 数组

转载 作者:太空宇宙 更新时间:2023-11-04 06:13:44 24 4
gpt4 key购买 nike

我动态分配一个 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() 是否只能用于初始化 2D 矩阵?

** 我知道 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);

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

最佳答案

您的“3d 数组”并不是像 memset 期望的那样真正的数组数组。如果我们把它画出来,它看起来像这样:

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

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

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


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

关于c - memset() 中的错误 3D 数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50703042/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com