c - 对二维数组的“memset”的混淆和“free”的错误
问题描述
我malloc
用来动态分配内存,memset
用来初始化二维数组,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' 中的错误:free(): invalid next size (fast): 0x0000000000c06030 *
第二个问题是:因为使用的前提memset
是有连续的内存。这就是为什么它不适用于 3D 数组(请参阅Error in memset() a 3D array)。但这里a
是一个二维指针或数组,的输入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
。我对吗?如果不连续,怎么初始化成功呢?(来自经过测试的开源代码)
解决方案
上图显示了连续内存。
不,它没有。它显示了两个连续内存区域:a[0][0] -> a[0][n2 - 1] 和 a[1][0] -> 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);
仅在“真实”二维数组的情况下,例如float a[2][5];
,您对连续内存的假设是正确的。
推荐阅读
- python - AttributeError:模块“torch.utils”没有属性“tensorboard”
- python - 如何使用 OSMnx 从 OSM 格式的 XML 文件创建过滤图?
- javascript - 嵌入消息不显示在聊天中
- react-native - 在 React-Native 中为“未定义”显示错误的按钮
- javascript - 禁用自动填充到表单元素
- vb.net - 在 Vb.Net 中将唯一项添加到 ListView
- javascript - 当用户选中复选框时附加一个按钮,反之亦然
- ansible - Ansible 日志记录 - 谁、什么、什么时候
- javascript - 如何 - 报价幻灯片
- node.js - Sails-mongo 不使用 MongoDB Atlas URI