跳转至

4.4 数组与函数——常见的"坑"

写单片机程序时,你会把代码分成很多小函数。数组传给函数时有个你可能没想到的行为:

#include <stdio.h>

// 这个函数想打印数组的长度
void print_len(int arr[]) {
    printf("函数内部:sizeof(arr) = %zu\n", sizeof(arr));
    // 这里不会打印 20,而是打印 8 或 4(指针的大小!)
}

int main() {
    int data[5] = {10, 20, 30, 40, 50};
    printf("main里:sizeof(data) = %zu\n", sizeof(data));   // 20 ✅

    print_len(data);   // 传进去的其实是"数组的起始地址",不是整个数组
    return 0;
}

输出:

main里:sizeof(data) = 20
函数内部:sizeof(arr) = 8    ← 变成了指针的大小!

原因: C 语言里,数组传给函数时"退化"(decay)成了指针——只告诉函数"数组在内存的哪里",不告诉"有多长"。

解决办法: 把数组和长度一起传过去。

// ✅ 正确的写法:长度也作为参数传进去
void print_array(int arr[], int len) {
    for (int i = 0; i < len; i++) {
        printf("%d ", arr[i]);
    }
    printf("\n");
}

int main() {
    int data[5] = {10, 20, 30, 40, 50};
    int count = sizeof(data) / sizeof(data[0]);

    print_array(data, count);  // ✅ 数据和长度一起传
    return 0;
}

👉 这个"坑"等学到指针时会彻底搞懂,现在先记住:数组传进函数后,长度信息就丢了,必须额外传长度。