2

在尝试分配 20x10 的 2D 数组时,在哪些步骤中分配了内存

第1步:int (*p)[10];

第2步:p = malloc( 20 * sizeof(*p) );

是在步骤 2 中分配了所有内存(20 x 10 x 4 字节)还是在步骤 1 中也分配了一些内存?

4

2 回答 2

4

第一步只是一个指针,除了单个指针之外不分配任何东西。请记住,它是指向数组的指针,而不是指针数组。

数组中使用的所有存储都由您的malloc()调用分配。

于 2012-09-28T13:10:30.230 回答
3

步骤 1 创建一个指针作为自动变量。指向的类型是 array-of-10- int

第 2 步为 20 个这样的数组分配内存(打印出来sizeof(*p)看看每个数组有多大——分配的块是那个的 20 倍),并将指向该内存块的指针分配给p.

所以,p现在指向一个包含 20 个 10 数组的数组的第一个元素int

如果它有助于理解,代码相当于:

typedef int my_array[10];
my_array *p = malloc(20 * sizeof(my_array));

第二行可能看起来更像你习惯的malloc. 不过,您仍然可以(并且应该)使用sizeof(*p)而不是sizeof(my_array)

malloc非常简单——它需要一个数字,然后分配那么多字节。它不关心内存的类型。因此,当您不确定要分配多少内存时,您总是可以简单地打印该数字(或在调试器中查看它)。

于 2012-09-28T13:16:56.830 回答