C语言数组与函数:显式传递长度并统计有效记录
把非负时长累计封装为函数,显式传入数组长度,处理空输入并避免在函数中误用 sizeof 推断元素数量。
本节目标
把非负时长累计封装为函数,显式传入数组长度,处理空输入并避免在函数中误用 sizeof 推断元素数量。
环境与运行方法
准备支持 C17 的 Clang 或 GCC。保存为 lesson.c,执行 cc -std=c17 -Wall -Wextra -Werror lesson.c -o lesson,编译后执行 ./lesson。命令适用于 macOS/Linux;Windows 需要相应的 C 工具链。
核心思路
普通数组形参按指针处理,只有一个地址无法得知元素数量。让调用者同时提供长度,并约定长度为零时不访问地址,可以清楚表达边界。这里不修改原数组,所以使用 const 指针。
完整示例
#include <stdio.h>
#include <stddef.h>
long total_minutes(const int *values, size_t count) {
long total = 0;
for (size_t i = 0; i < count; ++i)
if (values[i] >= 0) total += values[i];
return total;
}
int main(void) {
int values[] = {20, -5, 35, 0};
size_t count = sizeof values / sizeof values[0];
printf("total=%ld\n", total_minutes(values, count));
printf("empty=%ld\n", total_minutes(NULL, 0));
}预期输出
total=55
empty=0逐步理解
main 中的 values 是完整数组,sizeof 比值能够得到四个元素。函数中的循环只访问小于 count 的下标,最大合法下标是 count-1。
NULL 与零长度搭配时循环不执行,因此不解引用空指针。这不是允许任意空指针访问:非零长度时必须提供足够的有效内存。long 也有范围上限,大规模累计需要检查溢出。
常见问题与边界
- i<=count 会越界一次。
- 指针的 sizeof 不是数组容量。
- 不应把“传入长度”当成自动验证内存有效性的机制。
动手练习
追加 10 后重新运行,再改为两个负数。
参考答案
追加后总和为 65;两个负数都被跳过,总和为 0。数组长度表达式随初始化元素数量改变,不必同步维护一个写死的常量。
文章回复
0 条公开回复