c - 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);
这也不是连续内存?但它可以得到正确的结果。
解决方案
您的“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
来初始化你的数组。
有一些方法可以让它成为一个连续的内存区域,但是你不能再真正使用漂亮的数组索引,而是必须使用算术来计算每个索引。
推荐阅读
- python - 如何在validation_schema中动态设置skip_on_field_errors?
- go - 当前用户为root时如何以普通用户身份执行shell命令
- javascript - 如何关闭 Tealium web 的日志记录?
- mysql-5.6 - 当 select 什么都不返回时返回一行 NULL?
- uitableview - > 20K 行的不同数据源性能问题
- r - 从R中的JSON文件中提取数据
- python - 在使用字典理解创建字典时将值分配给现有字典键
- flux-influxdb - InfluxDB 总和最后一点
- java - 如何更新 Spring Data JPA 中的递归实体
- javascript - 如何根据索引值将状态变量更改为真