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解读就是-121000截断为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
相关产品推荐
相关产品推荐

