何时在将数组声明为数组指针时分配内存

时间:2012-09-28 13:05:21

标签: c declaration multidimensional-array dynamic-allocation

在尝试分配20x10的二维数组

时,在这些步骤中分配了内存

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

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

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

2 个答案:

答案 0 :(得分:4)

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

阵列中使用的所有存储都是通过malloc()电话分配的。

答案 1 :(得分:3)

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

步骤2为20个这样的数组分配内存(打印出sizeof(*p)以查看每个数组有多大 - 分配的块是该数组的20倍),并将指向该内存块的指针分配给{{1 }}

因此,p现在指向20个数组的数组的第一个元素 - 10 - p

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

int

第二行可能看起来更像是typedef int my_array[10]; my_array *p = malloc(20 * sizeof(my_array)); 所习惯的。尽管如此,您仍然可以(并且应该)使用malloc而不是sizeof(*p)

sizeof(my_array)非常简单 - 需要一个数字,它会分配那么多字节。它并不关心内存的类型。因此,当您怀疑要分配多少内存时,您始终只需打印该数字(或在调试器中查看)。