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;
}
输出:
原因: 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;
}
👉 这个"坑"等学到指针时会彻底搞懂,现在先记住:数组传进函数后,长度信息就丢了,必须额外传长度。