如何获取C语言数组中能被3整除的元素并计算其总和?
问题分析与解决方案
原代码的核心问题
- 数组参数退化导致长度计算错误:C语言里数组作为函数参数传递时会被转换为指针,
sizeof(arr)取的是指针的字节数(比如32位系统是4),而非数组总长度,因此sizeof(arr)/sizeof(arr[0])算出的n完全错误,直接导致sum函数的循环逻辑混乱。 - 累加逻辑错误:每次找到符合条件的元素就新建单元素数组调用sum,既无法累积所有符合条件元素的总和,sum函数内部还直接打印当前累加值,再加上长度计算错误,最终输出乱码般的结果。
- 函数返回值缺失:sum函数声明为
int类型却未返回任何值,属于C语言中的未定义行为。 - 输出格式混乱:部分
printf未添加正确换行,导致输出内容连在一起,不符合预期格式。
最简修正方案
直接在main函数内完成所有逻辑,避免多余函数带来的问题:
#include <stdio.h> int main() { int F[5] = {1, 3, 5, 9, 8}; int total_sum = 0; for (int i = 0; i < 5; i++) { if (F[i] % 3 == 0) { printf("%d\n", F[i]); total_sum += F[i]; } } printf("%d\n", total_sum); return 0; }
保留sum函数的修正版本
如果需要复用累加逻辑,可以修改sum函数,手动传递数组实际长度:
#include <stdio.h> // 传入数组和真实长度,返回累加总和 int sum(int arr[], int len) { int total = 0; for (int y = 0; y < len; y++) { total += arr[y]; } return total; } int main() { int F[5] = {1, 3, 5, 9, 8}; int diviz[5]; int count = 0; int total_sum; for (int i = 0; i < 5; i++) { if (F[i] % 3 == 0) { diviz[count] = F[i]; printf("%d\n", diviz[count]); count++; } } total_sum = sum(diviz, count); printf("%d\n", total_sum); return 0; }
版本说明
- 最简版本直接在遍历过程中打印符合条件的元素并累加,最后输出总和,完全匹配预期输出。
- 保留sum函数的版本先收集所有符合条件的元素,再调用sum计算总和,核心是给sum函数传递了真实的数组长度,彻底解决了指针退化导致的长度计算问题。
内容的提问来源于stack exchange,提问作者Romeo Tilipet
相关产品推荐
相关产品推荐

