C语言函数传数组参数时sizeof计算数组长度异常是何原因
产生该现象的核心原因
C语言中数组作为参数传入函数时,会发生数组到指针的隐式退化:函数接收到的不是完整的数组,而是指向数组首元素的指针,数组的长度信息不会随参数传递进入函数。
你写的第二个版本的SumOfElements函数中,形参int A[]本质等价于int *A,此时在函数内部计算sizeof(A),得到的是int类型指针本身占用的内存大小,而非整个数组占用的内存大小。
你运行后得到返回值2,是因为你当前使用的是64位编译环境:64位环境下指针类型固定占8字节,基础int类型通常占4字节,因此sizeof(A)/sizeof(A[0])的计算结果为8/4=2,for循环只会执行2次。
额外说明:你贴出的两段代码中,局部变量
sum都没有显式初始化为0就直接执行自增操作,属于未定义行为。第一个版本能返回正确结果5,只是因为函数调用时栈上sum对应的内存初始值刚好为0,这种写法存在随机出问题的风险。
第一个版本可以正常运行,是因为你在数组尚未发生退化的作用域(即定义数组的作用域,通常是main函数内部)提前计算好了数组的真实长度,将长度作为独立参数传入函数,循环终止条件准确,因此可以得到预期结果。
编写相关代码的注意事项
- C语言本身不提供在被调用函数内部直接获取传入数组真实长度的机制,通用处理方案就是你第一个版本的写法:将数组首地址、数组长度作为两个独立参数一同传入函数。
- 所有局部变量在参与运算前必须显式初始化,避免读取栈上残留的垃圾值,产生不可预期的运行结果。
内容的提问来源于stack exchange,提问作者errarnumbawan
相关产品推荐
相关产品推荐

