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

C语言使用动态内存分配的代码第二次迭代起输入被跳过原因排查

问题成因

核心是代码存在内存非法访问(未定义行为),运行时破坏了程序的正常内存布局,进而导致输入逻辑异常,具体错误点如下:

  • 指针数组赋值的下标使用错误
    两个分支中给array分配元素内存时,循环变量为j,但实际赋值用的是外层循环的变量i:
    // 错误写法
    for(int j=0;j<3;j++)
        array[i] = (char *)malloc(9);
    
    以上代码会导致所有的内存都分配给了array[i],array的其他元素都是未初始化的野指针。后续调用scanf("%s", array[1])/scanf("%s", array[2])时,会往野指针指向的非法内存写入数据,直接破坏程序的内存结构(包括可能破坏标准输入缓冲区的控制数据、栈上的其他变量值等),最终出现输入被跳过的异常表现。
  • 变量命名冲突(非直接诱因,但存在隐患)
    内部释放内存的循环又重新定义了同名变量i,虽然C99及以后标准中该变量属于块级作用域,不会直接修改外层循环的i,但极易引发逻辑混淆,建议替换为其他变量名。
  • 补充隐患:输入边界缺失
    flag数组长度为4,仅能存储3个有效字符+1个结束符,若用户输入超过3个字符会发生栈溢出,同样会触发未定义行为。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.30 18:39:03