You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

C语言传递数组求元素和结果不符:sizeof计算数组长度异常

数组求和结果不符合预期的原因分析

我尝试在不预先知晓数组长度的情况下对int类型数组元素求和,编写了如下C语言代码:

#include <stdio.h>

int sum(int anArray[]) {
  
  int sum = 0;
  size_t arrayLength = sizeof(anArray) / sizeof(int);
  
  for(int i = 0; i < arrayLength; i++) {
    sum += anArray[i];
  }

  return sum;
}

int main() {
  int myIntegers[3] = {1, 2, 3};

  printf("sum: %d", sum(myIntegers));
  return 0;
}

运行后得到结果为3,但预期结果是6。特别地,sizeof(anArray)在我的机器上返回8(注:我的机器中sizeof(int)为4),而我预期它返回12。

问题根源

C语言中,数组作为函数参数传递时会自动退化为指向数组首元素的指针,函数参数里的int anArray[]本质上等价于int *anArray。因此sizeof(anArray)计算的是指针的字节数,而非整个数组的字节数。

在64位机器上,指针的大小通常是8字节,所以sizeof(anArray)/sizeof(int)的结果是8/4=2,循环只会执行2次,累加数组的前两个元素(1+2),最终得到3,而非预期的三个元素求和结果6。

解决方法

要正确计算数组求和,需要手动传递数组长度,或者在数组定义的作用域内先计算好长度:

修正后的代码示例

#include <stdio.h>

// 新增数组长度参数
int sum(int anArray[], size_t arrayLength) {
  int sum = 0;
  for(int i = 0; i < arrayLength; i++) {
    sum += anArray[i];
  }
  return sum;
}

int main() {
  int myIntegers[3] = {1, 2, 3};
  // 在数组定义的作用域内可以正确计算长度
  size_t len = sizeof(myIntegers) / sizeof(int);
  printf("sum: %d", sum(myIntegers, len));
  return 0;
}

此外,也可以使用哨兵值(如在数组末尾添加一个特殊标记值,循环到该值时终止),但这种方法需要确保数组元素中不会出现该哨兵值,适用性有限。

内容的提问来源于stack exchange,提问作者Svaris

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.19 15:25:18