以下声明的大小是多少?

时间:2018-06-05 22:54:09

标签: c memory

我的朋友和我正在争论这个。

char **array[2][2]; 

在内存8 + 2*2*8中占用的大小 - 指针数组的指针是8,指针数组是32吗? 或者它只是8因为我们正在声明一个指针数组的指针。这个声明不必为指针数组分配空间,只需要指针?

2 个答案:

答案 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个。