我的朋友和我正在争论这个。
char **array[2][2];
在内存8 + 2*2*8
中占用的大小 - 指针数组的指针是8,指针数组是32吗?
或者它只是8因为我们正在声明一个指针数组的指针。这个声明不必为指针数组分配空间,只需要指针?
答案 0 :(得分:9)
正如cdecl本可以告诉你的(有点摆弄),你的宣言
char ** array[2][2];
将array
声明为两个指向char
指针的两个指针数组的数组。这意味着总共有四个char **
类型的元素(没有别的)。 C没有指定大指针的大小,甚至指向不同类型的指针也具有相同的大小,但是在64位实现中,所有指针的宽度都是8字节。在这样的实现中,声明的对象的大小是2 * 2 * 8 == 32字节。没有额外的指针。
如果你想要一个指向2 {2} char *
数组的指针,那就不一样了:
char * (*array)[2][2];
...而且它的大小确实是一个指针的大小。在这种情况下,对于指向的2D阵列,不保留存储空间。
答案 1 :(得分:2)
编译器分配整个数组(32个字节)。您可以使用sizeof():
调查这些问题#include <stdio.h>
char ** array[2][2];
int main() {
printf("size = %zu\n", sizeof(array));
printf("size[0] = %zu\n", sizeof(array[0]));
printf("size[0][0] = %zu\n", sizeof(array[0][0]));
return 0;
}
在x86_64架构上返回:
size = 32
size[0] = 16
size[0][0] = 8
每个指针的长度为8个字节,而您的二维数组总共包含4个。