为什么C语言中sizeof(arr)在函数与main函数中结果不同?
问题原因解析:数组传参时的退化行为
这是C语言里经典的数组传参特性导致的差异,核心原因是数组作为函数参数传递时会自动退化为指向首元素的指针,具体拆解如下:
main函数中的计算逻辑
在main里,arr是真正的数组变量,sizeof(arr)计算的是整个数组的总字节数。你的数组包含7个int元素,假设当前环境下int占4字节,总字节数就是7×4=28;sizeof(arr[0])是单个int的大小4,28÷4=7,所以能得到正确的元素个数。pa函数中的计算逻辑
pa函数的参数int arr[]只是写法上的数组,实际编译时会被等价处理为int*(int类型指针)。此时sizeof(arr)计算的是指针变量的字节大小——64位系统里指针占8字节,32位系统里占4字节。你的环境应该是64位,所以sizeof(arr)=8,除以单个int的4字节,结果就是2,这就是两者差异的根源。
额外提一句:pa函数里的循环for(int i=0;i<sizeof(arr)-1;i++)能遍历完所有元素纯属巧合——64位下sizeof(arr)-1=7,刚好和数组元素个数一致,但如果数组元素更多或者换成32位环境(指针占4字节,sizeof(arr)-1=3),就会出现遍历不全或者数组越界的问题,这是个隐藏bug。
内容的提问来源于stack exchange,提问作者x_skark
相关产品推荐
相关产品推荐

