C 动态创建仅具有一个已知维度的二维阵列
我想动态创建一个二维数组,如下所示:C 动态创建仅具有一个已知维度的二维阵列,c,arrays,C,Arrays,我想动态创建一个二维数组,如下所示: +------+------+ | i | j | +------+------+ // 2 cols and N rows (N unknown) | 2 | 2048| +------+------+ | 3 | 3072| +------+------+ | 5 | 256| +------+------+ | ... | ....| +------+------+ 这是一个关于如何填充数组的伪代码: in
+------+------+
| i | j |
+------+------+ // 2 cols and N rows (N unknown)
| 2 | 2048|
+------+------+
| 3 | 3072|
+------+------+
| 5 | 256|
+------+------+
| ... | ....|
+------+------+
这是一个关于如何填充数组的伪代码:
int N = 4096;
void foo(int N)
{
for (i =0;i<N;i++)
{
int j = index_computation(i);
if(j>i)
{
//alocate array row
A[i][0] = i;
A[i][1] = j;
}
}
}
int N=4096;
无效foo(int N)
{
对于(i=0;ii)
{
//alocate数组行
A[i][0]=i;
A[i][1]=j;
}
}
}
我对如何动态分配它有点困惑。最好的方法是忘记2D数组语法,只需创建一个包含2*Nrows条目的缓冲区。然后通过
A[i*2+0] = i;
A[i*2+1] = j;
当然,您还必须确保A足够大
A = realloc(A, N * 2 * sizeof *A);
要实现这一点,请在获得N的新边界时调用。由于2D数组是数组的数组,因此可以将其视为1D数组,其中2D数组的每一行都紧随其后:
int array2D[4][2] = { { 11, 12 }, { 21, 22 }, { 31, 32 }, { 41, 42 } };
int array1D[8] = { 11, 12, 21, 22, 31, 32, 41, 42 };
为什么它好?因为您不必介意是分配1D还是2D数组,关键在于如何对其进行索引。以下是我的例子:
#include <stdio.h>
#include <stdlib.h>
#define COL_NUM 2
int main() {
int rows = 5;
// allocate a 1D array, with size: rows * columns
int* array = (int*)calloc(rows * COL_NUM, sizeof(int));
// fill the array with some values
int i, j = 0;
for(i = 0; i < rows; ++i) {
array[i * COL_NUM + j] = 1; // index elements as if it were 2D array
j = (j + 1) % COL_NUM;
}
// print the quasi 2D array
for(i = 0; i < rows; ++i) {
for(j = 0; j < COL_NUM; ++j)
printf("%d ", array[i * COL_NUM + j]);
printf("\n");
}
free(array);
return 0;
}
正如下面的注释所警告的,将一维数组作为二维数组进行索引(使用上面显示的方法)是安全的,但这是未定义的行为。我以前的发言:
由于二维数组是数组的数组,因此可以将其视为一维数组
不应该被理解为您可以像索引一维数组一样索引二维数组。您的数组
a
是如何声明的?此外,诸如A[i][0]=i
之类的表达式不会“分配”任何内容。它为已经分配的空间赋值。对于动态分配,您需要使用malloc
。查看malloc
如果N
未知,那么您将如何分配它?你是说变量吗?也许这就是你要找的?否,否A[i][0]=i
我知道此表达式仅用于为数组空间A[i][j]赋值。。。我的问题是,如果我只知道数组有2列,我将如何分配数组?您必须小心:“您可以将其视为1D数组”;注意,例如,执行int*ptr=&array2d[0][0]是UB
,然后int val=*(ptr+3)
,它位于2d数组的边界内,但超出第一行的边界。还有一些讨论。@DavidBowling,谢谢你的警告,我把它添加到了我的答案中。
#define NUMBER_OF_COLUMNS 2
int row = 2, column = 0;
array2D[row][column] = 5;
array1D[row * NUMBER_OF_COLUMNS + column] = 5;