C 差异b/w以一次过或逐行方式将内存分配给二维数组

C 差异b/w以一次过或逐行方式将内存分配给二维数组,c,malloc,multidimensional-array,C,Malloc,Multidimensional Array,这两种情况对访问阵列或内存分配有什么影响: 一, 二, int**arr; arr=malloc(sizeof(*arr)*行); 对于(i=0;i 首先,“影响”是您的第一个方法被破坏。它无法通过int**指针工作 为了在第一种方法中一次分配2D数组,实际上必须分配足够大小的1D数组 int *arr = malloc( row * column * sizeof *arr ); // Note: `int *`, not `int **` 并通过手动索引重新计算来执行访问,例如,您必须执行

这两种情况对访问阵列或内存分配有什么影响:

一,

二,

int**arr;
arr=malloc(sizeof(*arr)*行);
对于(i=0;i
  • 首先,“影响”是您的第一个方法被破坏。它无法通过
    int**
    指针工作

    为了在第一种方法中一次分配2D数组,实际上必须分配足够大小的1D数组

    int *arr = malloc( row * column * sizeof *arr );
    // Note: `int *`, not `int **`
    
    并通过手动索引重新计算来执行访问,例如,您必须执行
    arr[i*column+j]
    而不是执行
    arr[i*column+j]

    试图将分配的指针存储在
    int**arr
    中,然后以
    arr[i][j]
    的身份访问数组只会导致崩溃

  • 其次,您的第二种方法是可以的。只是在第二种方法中,您实际上不需要通过多个独立的
    malloc
    调用来分配第二级内存。您可以一次性分配整个第二级内存

    int **arr = malloc( row  * sizeof *arr );
    int *arr_data = malloc( row * column * sizeof *arr_data );
    
    然后在行之间分配预先分配的第二级内存

    for (i = 0; i < row; i++)
      arr[i] = arr_data + i * column;
    
    (i=0;i arr[i]=arr_数据+i*列;
(当然,如果您愿意,您可以独立分配行。这也会起作用。我希望一次性分配它们的原因是为了更好地说明第一种方法和第二种方法之间的相似性,如下所述。)

现在,通过查看这两种方法,您可以很容易地看到它们基本上都做相同的事情。唯一的区别是,在第一种方法中,您可以通过每次计算
arr+i*列
(注意
arr[i*列+j]
相当于
(arr+i*列)[j]找到行的开头
)。在第二种方法中,通过使用相同的
arr\u data+i*列
公式预先计算所有行的开头,并将它们存储在单独的“行索引”数组
arr
中以供进一步使用


因此,它基本上归结为内存使用(第一种方法需要更少的内存)和速度(第二种方法可能更快,但不一定更快)之间的权衡。同时,第二种方法支持2D数组访问的“自然”语法-
arr[i][j]
,而在第一种方法中,您必须在索引重新计算时使用更复杂的1D访问语法。

我想您的意思是
malloc(row*column*sizeof(int));
是的。。感谢您提到Hanks@Andrey,解释得很好。我理解其中的每一点。我现在不会问这样愚蠢的问题:)+我不知道这种为2D分配内存的技术,谢谢!
int **arr = malloc( row  * sizeof *arr );
int *arr_data = malloc( row * column * sizeof *arr_data );
for (i = 0; i < row; i++)
  arr[i] = arr_data + i * column;