sizeof如何知道数组的大小?

Mar*_*ton 15 c c++ arrays pointers

我的代码如下:

main() {
    int array[5] = {3,6,9,-8,1};
    printf("the size of the array is %d\n", sizeof(array));
    printf("the address of array is %p\n", array);
    printf("the address of array is %p\n", &array);
    int * x = array;
    printf("the address of x is %p\n", x);
    printf("the size of x is %d\n", sizeof(x));
}
Run Code Online (Sandbox Code Playgroud)

输出是

the size of the array is 20
the address of array is 0x7fff02309560
the address of array is 0x7fff02309560
the address of x is 0x7fff02309560
the size of x is 8
Run Code Online (Sandbox Code Playgroud)

我知道变量array将被视为指向数组第一个元素的指针,所以我理解x的大小是8.但是我不知道为什么数组的大小是20.不是应该是8(64位机器)?

除了程序如何知道它是20?据我所知,它不存储元素的数量.怎么来sizeof(array)sizeof(x)不同?我跟踪了几个与阵列衰减相关的帖子,但对这个问题一无所知.

Jer*_*fin 16

大多数情况下,数组的名称衰减为指向数组第一个元素的指针.但是,该规则有几个例外.最重要的两个是数组名称用作sizeof运算符或address-of运算符(&)的操作数.在这些情况下,数组的名称仍然是整个数组的标识符.

对于非VLA数组,这意味着可以静态地确定数组的大小(在编译时),并且表达式的结果将是数组的大小(以字节为单位),而不是指针的大小.

当您获取数组的地址时,您将获得相同的值(即,相同的地址),就像您刚刚使用数组的名称而不使用地址一样.但是类型是不同的 - 当你明确地获取地址时,你得到的是一个类型为"指向N个T类型数组的指针"的指针.这意味着(例如)虽然array+1指向数组的第二个元素,但是&array+1指向刚好超过整个数组末尾的另一个数组.

假设至少有两个项的数组,*(array+1)将引用数组的第二个元素.无论数组大小如何,&array+1都会产生一个超过数组末尾的地址,因此尝试取消引用该地址会产生未定义的行为.

在你的情况,因为该阵列的尺寸是20,并且阵列中的一个元件的尺寸是4,如果array是,比方说,为0x1000,那么array+1将是0x1004&array+1将是0x1014(0×14 = 20).


小智 14

您的数组具有静态长度,因此可以在编译时确定.你的编译器知道sizeof(int) = 4你的静态数组长度[5].4*5 = 20

编辑:您的编译器int可能是32位,但是寻址64位.这就是为什么sizeof(pointer)返回8.


use*_*109 9

请注意,sizeof不是库函数.sizeof

编译时一元运算符[...],可用于计算任何对象
K&R 的大小

所以sizeof不知道数组有多大,编译器知道数组的大小,以及定义

应用于数组时,结果是数组中的总字节数.
K&R


Gop*_*opi 7

指针和数组是2种不同的数据类型.

数组可以包含类似数据类型的元素.数组的内存是连续的.

指针用于指向某个有效的内存位置.

sizeof(type) 为您提供所传递类型的字节数.

现在,如果你传递数组,那么编译器知道这是一个数组和元素的数量,它只是将那么多元素与相应的数据类型大小值相乘.

在这种情况下:

5*4 = 20
Run Code Online (Sandbox Code Playgroud)

同样是sizeof(int)sizeof(pointer)依赖于平台.在这种情况下,你看到sizeof(pointer)8.