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],是带长度的
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中的数组不一样。
有帮助请采纳,谢谢!