单个malloc调用中的二维数组

use*_*121 2 c malloc multidimensional-array

int **arrayPtr; 
arrayPtr = malloc(sizeof(int) * rows *cols + sizeof(int *) * rows);
Run Code Online (Sandbox Code Playgroud)

在上面的代码中,我们尝试在单个malloc调用中分配2D数组. malloc需要多个字节并为那么多字节分配内存,但在上面的例子中,如何malloc知道首先它必须分配一个指针数组,每个指针都指向一维数组?

malloc在这种特殊情况下,内部如何工作?

Kos*_*Kos 5

2D数组与指向数组的指针数组不同.

int **arrayPtr没有定义2D数组.2D数组看起来像这样:

int array[2][3]

并且指向此数组的第一个元素的指针如下所示:

int (*array)[3]

你可以指向一块内存:

int (*array)[3] = malloc(sizeof(int)*5*3);


请注意它是如何编入索引的:

  • array[x]将扩展为*(array+x),所以"x向前3个阵列".
  • array[x][y]将扩展到*( *(array+x) + y),所以"然后向前推进".

这里没有直接的指针数组,只有一个连续的内存块.

如果你有一个数组数组(与2D数组不同,通常使用int** ptr和一系列每行mallocs),它会像:

  • ptr[x]会扩大到*(array+x),所以"x指针向前"
  • ptr[x][y]会扩展到*( *(array+x) + y)="y ints forward".

注意区别.两者都用[x] [y]索引,但它们在内存中以不同的方式表示,索引以不同的方式发生.