我在理解 C 如何为 2D(或更多维)数组分配空间时遇到问题,尤其是当我们使用 malloc
等时。拿程序在this question例如。
首先定义一个一维指针数组,然后将指向一维数据数组(在本例中为字符串)的指针放入第一个一维数组的每个框中。所以不能保证整个二维数组是连续的(上一行的最后一个单元格后面是下一行的第一个单元格)。每个 1D 数据数组都可以很远,只有它们的指针是连续的。我是对的还是我错过了什么?如果您能帮我澄清一下,我将不胜感激。
最佳答案
有多种方法可以实现,具体取决于您将如何访问它。您可以确保数组的主体是连续的,也可以避免这种情况。对于字符串数组,您通常不会费心让数组的主体连续。对于整数或 double 的二维(等)数组,通常会使数组的主体连续。
在示例中,数组的数据类型是泛型类型 T
,假定为数字,因此可以为数组元素分配 0
。这些示例不会错误检查内存分配;他们应该在生产代码中。
使用计算索引进行数组访问——连续的数组主体
int n1 = 5;
int n2 = 6;
T *a = malloc(n1 * n2 * sizeof(T));
for (int i = 0; i < n1; i++)
for (int j = 0; j < n2; j++)
a[i * n2 + j] = 0;
free(a);
双下标数组访问——连续的数组体
int n1 = 5;
int n2 = 6;
T **a = malloc(n1 * sizeof(T*));
T *b = malloc(n1 * n2 * sizeof(T));
for (int i = 0; i < n1; i++)
a[i] = &b[i * n2];
for (int i = 0; i < n1; i++)
for (int j = 0; j < n2; j++)
a[i][j] = 0;
free(b);
free(a);
双下标数组访问——不连续的数组体
int n1 = 5;
int n2 = 6;
T **a = malloc(n1 * sizeof(T*));
for (int i = 0; i < n1; i++)
a[i] = malloc(n2 * sizeof(T));
for (int i = 0; i < n1; i++)
for (int j = 0; j < n2; j++)
a[i][j] = 0;
for (int i = 0; i < n1; i++)
free(a[i]);
free(a);
关于c - C在使用malloc时如何为2D(3D ...)数组分配空间?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17584215/