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在这种特殊情况下,内部如何工作?
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]索引,但它们在内存中以不同的方式表示,索引以不同的方式发生.