在其中的这些步骤,而试图分配20×10当同时声明一个数组为指针阵列的存储器分配
步骤的2D阵列内存被分配1:int (*p)[10];
步骤2:p = malloc(20 * sizeof(*p));
是否在步骤2中分配了所有内存(20 x 10 x 4字节) 或者在步骤1中还分配了一些内存量?
在其中的这些步骤,而试图分配20×10当同时声明一个数组为指针阵列的存储器分配
步骤的2D阵列内存被分配1:int (*p)[10];
步骤2:p = malloc(20 * sizeof(*p));
是否在步骤2中分配了所有内存(20 x 10 x 4字节) 或者在步骤1中还分配了一些内存量?
第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
很简单 - 它需要一个数字,它分配很多字节。它并不关心内存的类型。所以,如果您怀疑您分配了多少内存,您总是可以简单地打印该数字(或者在调试器中查看它)。
第一步只是一个指针,不会分配超出单个指针的任何内容。记住,它是一个指向数组的指针,而不是指针数组。
所有阵列中使用的存储是由您的malloc()
调用分配。
你确定你有'*'写吗? – elyashiv
[括号噩梦](http://stackoverflow.com/questions/859634/c-pointer-to-array-array-of-pointers-disambiguation) – UmNyobe
@elyashiv yes语法正确 – user1660982