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

C语言代码输出异常求助:赋值char数组后输出值与预期不符

C语言代码输出异常原因解析

原代码

#include <stdio.h>

int main() {
    char Roman[] = "IVXLCDM";
    int Num[] = {1,5,10,50,100,500,1000};
    int n = 0;

    do
    {
        Roman[n]=Num[n] ;
        printf("%i\n", Roman[n]);
        n++;
    } while (n<7);

    return 0;
}

预期输出

1
5  
10 
50 
100
500
1000

实际输出

1
5  
10 
50 
100
-12
-24

问题原因

核心问题出在**char类型的取值范围限制**:

  • 绝大多数系统中char是带符号类型,取值范围是 -128 ~ 127
  • 当你把500和1000这两个远超127的数值赋值给Roman[n](char类型变量)时,会触发整数溢出:
    • 500截断为8位二进制后是11110100,作为带符号char解读就是 -12
    • 1000截断为8位二进制后是11101000,作为带符号char解读就是 -24
  • 额外说明:你初始将Roman定义为字符串字面量,在部分环境中字符串字面量属于只读内存区域,直接修改它可能引发未定义行为,但这不是本次输出异常的直接原因。

修复方案

  • 最简单的方式:直接打印Num[n],完全不需要Roman数组,修改后代码如下:
#include <stdio.h>

int main() {
    int Num[] = {1,5,10,50,100,500,1000};
    int n = 0;

    do
    {
        printf("%i\n", Num[n]);
        n++;
    } while (n<7);

    return 0;
}
  • 如果一定要保留Roman数组,把它的类型从char改为int即可:
int Roman[7]; // 替换原char Roman[] = "IVXLCDM";

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.17 18:22:50