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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.28 19:27:03