C语言声明变长矩阵后char数组无法正常存储值是什么原因?
问题根本原因
你的代码触发了未定义行为,问题根源是输入格式符和变量类型不匹配:
- 你声明
pos为int类型数组:int pos[100]; - 但
scanf时用了%c格式符读取字符,%c要求传入的参数是char*类型,你传入的是int*类型,二者类型完全不匹配。
没有声明matriz矩阵时,栈内存的布局刚好让这个错误没有显现出副作用;加入可变长数组matriz之后,栈的内存排布发生变化,类型不匹配的问题就直接暴露出来,导致字符存储异常。
另外int类型通常占用4字节内存,char仅占1字节,用%c向int变量写入数据时,只会修改1个字节的内容,剩下3个字节是随机的垃圾值,后续执行pos[i] -= 97的计算结果自然也是错误的。
解决方案
直接修改pos数组的类型为char即可:
// 把 int pos[100]; 改成下面的代码 char pos[100];
如果业务需要必须用int类型存储字符值,可以加临时char变量中转:
for(i=0; i<num;i++){ char tmp; scanf(" %c%d", &tmp, &pos1[i]); pos[i] = tmp; }
额外注意事项
- 你当前的
pos、pos1数组都是固定长度100,需要增加输入校验,避免num输入值超过100导致数组越界,触发新的未定义行为。 int matriz[linhas][col]属于C99引入的可变长数组(VLA)特性,部分编译器可能不支持;如果linhas、col输入值过大,会直接占满栈空间导致栈溢出,大尺寸矩阵建议改用malloc动态分配堆内存。
内容的提问来源于stack exchange,提问作者Game changer
相关产品推荐
相关产品推荐

