C语言数组大小计算错误:输出为2而非预期的4
C语言数组传参后sizeof计算异常问题分析
你的代码
#include <stdio.h> size_t arrSize(int a[]) { return sizeof(a)/sizeof(a[0]); } int main() { int alfa[]={1, 2, 3, 4}; size_t s= arrSize(alfa); printf("Array size: %zu", s); return 0; }
问题原因
核心问题是C语言中数组作为函数参数时会自动退化为指向首元素的指针。函数定义里的int a[]语法本质上等价于int *a,所以在arrSize函数中:
sizeof(a)计算的是指针的字节大小(64位系统通常为8字节,32位系统为4字节)sizeof(a[0])计算的是int类型的字节大小(通常为4字节)
如果是64位系统,8/4=2,这就是你得到输出2的原因。而在main函数中直接计算时,alfa是完整的数组类型,sizeof(alfa)会返回整个数组的总字节数(4个int共16字节),除以单个int的大小就得到正确的元素个数4。
解决方法
- 直接在数组作用域内计算长度:就像你在
main里直接写size_t s=sizeof(alfa)/sizeof(alfa[0])的方式,这是最简单直接的做法。 - 将数组长度作为参数传递:修改函数定义,额外接收数组长度参数:
size_t arrSize(int a[], size_t len) { return len; } // 调用时 size_t s = arrSize(alfa, sizeof(alfa)/sizeof(alfa[0])); - 使用宏计算数组长度:定义一个宏来在数组作用域内计算长度,避免传参退化的问题:
#define ARR_SIZE(arr) (sizeof(arr)/sizeof(arr[0])) // 在main中使用 size_t s = ARR_SIZE(alfa);
内容的提问来源于stack exchange,提问作者quadron21
相关产品推荐
相关产品推荐

