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

C语言数组越界致值异常求助:Turbo C与其他编译器表现不同

数组越界引发的未定义行为分析

问题核心

你定义的int arr[] = {0};仅分配了1个int大小的内存空间,但代码中却向arr[1]写入数据——这属于数组越界访问,是C语言中典型的未定义行为。这类行为的表现完全依赖编译器的内存布局、优化策略,所以不同环境下会出现完全不同的输出,甚至每次运行结果都可能不一致。

不同环境的表现解释

1. Turbo C 输出正常的原因

Turbo C是16位老旧编译器,函数栈的布局和现代编译器差异极大。你越界写入的arr[1]刚好落在未被其他关键变量占用的内存区域,没有覆盖到影响程序逻辑的数据,所以看起来输出正常,但这只是偶然巧合,绝非正确的代码行为。

2. 现代编译器的异常输出逻辑

现代编译器(如GCC、Clang)的栈布局更紧凑,arr数组和循环变量i的内存位置相邻:

  • 用scanf给arr[1]写入3时,实际覆盖了循环变量i的初始内存空间;
  • 循环开始时i=0,输出arr[0]=2,随后i++变为1;
  • 此时读取arr[1],实际读取的是循环变量i当前的值1,所以输出1;
  • 调试代码中,循环结束后i的值变为2,此时再读取arr[1],实际读取的是i的当前值2,因此出现后续输出2的诡异现象。

修复方案

明确将数组定义为包含2个元素的大小,确保有足够内存存储输入数据:

#include <stdio.h>
#include <conio.h>

int main () {
    // 明确数组大小为2
    int arr[2] = {0};

    scanf("%i", &arr[0]);
    scanf("%i", &arr[1]);

    for (int i = 0; i < 2; i++) {
        printf("value of i %i\n", i);
        printf("%i\n", arr[i]);
    }

    printf("%i\n", arr[0]);
    printf("%i\n", arr[1]);

    getch();
}

原始代码与输出参考

初始代码

#include <stdio.h>
#include <conio.h>

int main () {
    int arr[] = {0};

    scanf("%i", &arr[0]);
    scanf("%i", &arr[1]);

    for (int i = 0; i < 2; i++) {
        printf("value of i %i\n", i);
        printf("%i\n", arr[i]);
    }

    getch();
}

普通编译器输出

2 //this is an input
3 //this is an input
value of i 0
2
value of i 1
1

Turbo C输出

2 //this is an input
3 //this is an input
value of i 0
2
value of i 1
3

调试代码

#include <stdio.h>
#include <conio.h>

int main () {
    int arr[] = {0};

    scanf("%i", &arr[0]);
    scanf("%i", &arr[1]);

    for (int i = 0; i < 2; i++) {
        printf("value of i %i\n", i);
        printf("%i\n", arr[i]);
    }

    printf("%i\n", arr[0]);
    printf("%i\n", arr[1]);

    getch();
}

调试后输出

2 //this is an input
3 //this is an input
value of i 0
2
value of i 1
1
2
2

内容的提问来源于stack exchange,提问作者mimas

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.13 01:41:17