int **arrayPtr;
arrayPtr = malloc(sizeof(int) * rows *cols + sizeof(int *) * rows);
在上面的代码中,我们尝试在单个 malloc
调用中分配一个二维数组。
malloc
获取一定数量的字节并为那么多字节分配内存,
但是在上面的例子中,malloc
怎么知道首先它必须分配一个指针数组,每个指针指向一个一维数组?
malloc
在这种特殊情况下如何在内部工作?
最佳答案
二维数组与指向数组的指针数组不同。
int **arrayPtr
没有定义二维数组。二维数组如下所示:
整数数组[2][3]
指向该数组第一个元素的指针如下所示:
int (*array)[3]
你可以指向一 block 内存:
int (*array)[3] = malloc(sizeof(int)*5*3);
注意它是如何编入索引的:
array[x]
将扩展为*(array+x)
,因此“x 个 3 整数数组向前”。array[x][y]
将扩展为*( *(array+x) + y)
,因此“然后 y 整数转发”。
这里没有直接的指针数组,只有一个连续的内存块。
如果你有一个数组数组(与 2D 数组不同,通常使用 int** ptr
和一系列每行 mallocs 完成),它会像:
ptr[x]
会扩展为*(array+x)
,所以“x pointers forward”ptr[x][y]
将扩展为*( *(array+x) + y)
= "y ints forward"。
注意区别。两者都使用 [x][y] 进行索引,但它们在内存中以不同的方式表示,并且索引以不同的方式进行。
关于c - 单个 malloc 调用中的二维数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10953787/