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
相关产品推荐
相关产品推荐

