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

C语言中二维char数组为何产生异常输出?

C语言二维char数组输出异常问题解析

问题背景

重新学习C语言,在练习循环题型时,用二维char数组实现数字转英文单词的功能,出现输出异常,打印出了额外的"nine"。

编写的代码

int main() 
{
    int a, b;
    scanf("%d\n%d", &a, &b);
    char rep[9][5] = {"one", "two", "three", "four", "five", "six", "seven", "eight", "nine"};

    for(int i = a; i <= b; i++)
    {
        if(i <= 9 && i >= 1)
        {
            printf("%s\n", rep[i - 1]);
        }
        else
        {
            printf((i % 2 == 0) ? "even\n" : "odd\n"); 
        }     
    }

    return 0;
}

得到的异常输出

eightnine
nine
even
odd

问题原因

核心问题出在二维char数组的空间分配与字符串结束符\0的缺失:

  • C语言中,printf("%s")输出字符串时,会从起始地址持续读取,直到遇到字符串结束符\0才停止。
  • 你定义的char rep[9][5]给每个单词分配了5个字符的空间:
    • 像"one""nine"这类单词(不含\0)长度为3或4,编译器会自动在末尾补\0,输出正常;
    • 但"eight"本身有5个字符(e、i、g、h、t),刚好占满5个char的空间,没有多余位置存放\0。
  • 当printf输出"eight"对应的rep[7]时,因为找不到\0,会继续读取相邻内存的内容——而rep[8]就是"nine",所以会把两个字符串连在一起输出,形成"eightnine"。

而用const char*数组的方式时,每个字符串字面量都会被编译器自动添加\0,且每个指针指向独立的字符串存储区域,不会出现这种越界读取的情况。

另外补充:代码里scanf("%d\n%d")中的\n可能会导致输入时需要额外输入换行或空白符才能结束读取,建议改为scanf("%d%d", &a, &b)。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.28 12:25:04