C语言中关于sizeof的结果?

64位环境中为什么使用两种方式得到的结果不一致? 见代码

#include <stdio.h>

void arrayLength(int numbers[]);

int main() {
    int numbers[] = {1, 2, 3};
    printf("size of numbers: %llu\n", sizeof(numbers)); // 12, 这里的numbers是指针, sizeof是如何知道其有多少个元素的?
    arrayLength(numbers);
    return 0;
}

void arrayLength(int numbers[]) {
    printf("size of numbers: %llu\n", sizeof(numbers)); // 8, 这里的结果为什么与main中得到的结果不一致? 这里的numbers也是指针啊,而且地址跟main中的一样
}

传入函数的是指针,指针本身不带长度信息,这个没什么问题
在main中直接打印的话,因为你使用了初始化器
这是在main中数组长度会由初始化器长度决定
而同一个函数内部直接看到的是一个int[3],是带长度的

img

sizeof是关键字,不是函数,它是在编译时计算的,所以他只会算实际分配的内存大小,而不管你用了多少(用了多少是你运行之后确定的)
第一个因为是在自己区域内,所以可以知道大小
第二个因为在函数内,传参只是传指针,所以只会得到指针的大小

数组名是数组首元素地址,数组传参会退化为指针,而指针在32.64位平台下大小是不一样的,32位为4字节,64位为8字节

当然不一样,主程序

int main() {
    int numbers[] = {1, 2, 3};
    printf("size of numbers: %llu\n", sizeof(numbers)); // 12,

这里的numbers不是指针而是包含3个4字节int的数组, sizeof是计算

4*3=12

字节;
而在void arrayLength(int numbers[]) {函数中,传入的numbers,c语言由于不能传递数组参数所以将其以int*指针对待,所以:

 printf("size of numbers: %llu\n", sizeof(numbers)); // 8, 

这里的结果与main中得到的结果不一致, 这里的numbers是指针(64位是8字节),与main中的数组不一样。

有帮助请采纳,谢谢!