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;