C语言中将数组传递给函数计算元素和时出现错误如何解决
问题根因
C语言中,数组作为函数参数传递时会自动退化为指针,函数参数列表里的int arr[]和int *arr是完全等价的。你在add函数中使用sizeof(arr)计算得到的是指针的内存占用大小,而非整个数组的总大小。
以你当前运行环境为例:指针占8字节,int类型占4字节,因此sizeof(arr)/sizeof(arr[0])的计算结果为2,循环仅执行2次,累加了arr[0]=1和arr[1]=2,最终得到结果3,和编译警告提示的问题完全对应。
修复方案
通用解决方案是在调用求和函数时,额外传递数组的长度作为参数,修改后的代码如下:
#include <stdio.h> // 新增参数len接收数组长度 int add(int arr[], int len); int main(void) { int nums[] = { 1, 2, 4, 8, 16, 32, 64, 128, 256, 512 }; // 在main函数中计算数组长度,此时nums还未退化为指针,计算结果正确 int len = sizeof(nums)/sizeof(nums[0]); int result = add(nums, len); printf("Result: %d\n", result); return 0; } int add(int arr[], int len) { int total = 0; int i; // 直接使用传入的长度控制循环次数 for (i = 0; i < len; i++) { total += arr[i]; } return total; }
修改后运行输出的结果为1023,和预期的数组元素总和一致。
内容的提问来源于stack exchange,提问作者Code With Faraz
相关产品推荐
相关产品推荐

