DevCN
菜单
全部文章快讯开发科技深度热点

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。数组长度表达式随初始化元素数量改变,不必同步维护一个写死的常量。

DISCUSSION

文章回复

0 条公开回复
未登录回复需要审核后公开
还没有回复,欢迎参与讨论。