You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

未传递数组仅传长度却能正确输出?求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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.27 05:33:36