未传递数组仅传长度却能正确输出?求C语言代码运行原理
C语言局部数组意外输出正确值的原因解析
问题描述
我编写了一段C语言代码,调用getArray和displayArray函数时仅传递数组长度,未传递数组参数,且数组并非全局变量——只是两个函数内分别定义了同名局部数组arr,却意外得到正确输出。即使在两个函数调用间添加printf语句,结果依然正确,无法理解其中原理,特向大家请教。
代码示例
#include <stdio.h> #include <stdlib.h> void getArray(int); void displayArray(int); int main(void) { int arr[100],size; printf("Enter the size of the array\n"); scanf("%d",&size); getArray(size); displayArray(size); return EXIT_SUCCESS; } void getArray(int size){ int arr[100],i; printf("Enter elements of the array \n"); for(i=0;i<size;i++){ scanf("%d",&arr[i]); } } void displayArray(int size){ int i,arr[100]; printf("Array is \n"); for(i=0;i<size;i++){ printf("%d\t",arr[i]); } }
运行情况
- 测试多组输入数据,均能正确输出数组内容
- 在
getArray和displayArray调用中间加入printf("hello world")语句后,输出结果依然正确
原因解析
这是未定义行为引发的巧合,绝非C语言的正常机制:
- 栈内存复用:局部变量存储在栈中,当
getArray执行完毕返回时,它的栈帧会被标记为可复用,但栈内的数据不会被主动清空。而displayArray中的局部数组arr,刚好在栈上占据了和getArray里的arr完全相同的内存区域,因此读取到了之前残留的数据。 - 中间加
printf仍能正确,只是因为这次printf调用没有覆盖arr所在的栈内存区域。如果换用其他占用更多栈空间的函数,或者修改编译优化选项、调整代码结构,结果会立刻变成随机的垃圾值。
注意事项
这种写法属于严重错误,绝对不能用于实际开发:
- 局部变量的生命周期仅限于函数内部,函数返回后,其对应内存地址的内容是未定义的,随时可能被覆盖
- 不同函数的局部变量相互独立,编译器没有义务保证它们会复用同一块内存,环境稍有变化,结果就会彻底失效
内容的提问来源于stack exchange,提问作者Subhayya A S
相关产品推荐
相关产品推荐

