数组传参取值出现未知错误,请求修复代码(学习函数返回数组技术)
问题修复与解释
修复后的代码
#include <stdio.h> // 提前声明display函数,避免隐式声明警告 void display(int m[10], int n); int main() { int a[10], i; printf("enter 10 elements: "); // 修复输入循环边界:数组仅10个元素,索引范围0-9 for (i = 0; i < 10; i++) { scanf("%d", &a[i]); } display(a, 10); return 0; } void display(int m[10], int n) { int i; // 修复打印循环边界:仅遍历n个有效元素 for (i = 0; i < n; i++) { // 修复索引:使用i遍历每个元素,添加空格分隔输出 printf("%d ", *(m + i)); } }
代码错误点修复说明
- 输入循环越界:原代码
for (i = 0; i < 11; i++)会写入数组a之外的内存(数组仅10个元素,索引0-9),触发未定义行为,改为i < 10。 - 打印循环越界:display函数中
for (i = 0; i < n + 1; i++)会访问数组外的无效元素,改为i < n。 - 固定索引错误:原代码
printf("%d", *(m + 1));始终只打印数组的第2个元素(索引1),且无分隔导致输出混乱,改为*(m + i)遍历所有元素,同时添加空格分隔。 - 函数声明缺失:原代码中display函数在main之后定义却未提前声明,会触发隐式声明警告,添加函数声明解决。
关于返回局部变量地址的问题
你尝试返回a时编译器提示function returns address of local variable,原因是:
- 局部变量
a分配在main函数的栈帧中,当main执行完毕,栈帧会被销毁,对应的内存会被回收或重新分配。 - 返回这个地址后,后续访问该地址指向的内存时,读取到的是已失效的随机垃圾值,属于未定义行为,因此编译器会发出警告阻止这种错误。
内容的提问来源于stack exchange,提问作者zappi
相关产品推荐
相关产品推荐

