2012-09-28 23 views
2

在其中的这些步骤,而试图分配20×10当同时声明一个数组为指针阵列的存储器分配

步骤的2D阵列内存被分配1:int (*p)[10];

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

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

+0

你确定你有'*'写吗? – elyashiv

+1

[括号噩梦](http://stackoverflow.com/questions/859634/c-pointer-to-array-array-of-pointers-disambiguation) – UmNyobe

+0

@elyashiv yes语法正确 – user1660982

回答

3

第1步创建一个指针作为自动变量。指向的类型是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很简单 - 它需要一个数字,它分配很多字节。它并不关心内存的类型。所以,如果您怀疑您分配了多少内存,您总是可以简单地打印该数字(或者在调试器中查看它)。

4

第一步只是一个指针,不会分配超出单个指针的任何内容。记住,它是一个指向数组的指针,而不是指针数组。

所有阵列中使用的存储是由您的malloc()调用分配。