我在理解C如何为2D(或更多维)数组分配空间时遇到了问题,特别是在我们使用malloc等时.以这个问题中的程序为例.
首先定义一维指针数组,然后将指向1D数据数组(在这种情况下为字符串)的指针放在第一个1D数组的每个框中.因此无法保证整个2D数组是连续的(前一行的最后一个单元后跟下一行的第一个单元).每个1D数据阵列可以非常远,只有它们的指针是连续的.我纠正还是错过了什么?如果你能帮助我澄清这一点,我将非常感激.
有多种方法可以实现,具体取决于您将如何访问它.您可以确保阵列的主体是连续的,或者您可以避免这种情况.对于字符串数组,通常不需要使数组的主体连续.对于整数或双精度的2D(等)数组,通常会使数组的主体连续.
在示例中,数组的数据类型是泛型类型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);
Run Code Online (Sandbox Code Playgroud)
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);
Run Code Online (Sandbox Code Playgroud)
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);
Run Code Online (Sandbox Code Playgroud)