C语言修改变量声明顺序导致值随机变化、程序异常原因咨询
问题根本原因
核心问题是数组越界访问引发的未定义行为:
- 你定义的
coord数组长度为2,C语言中数组下标从0开始计数,合法的访问下标只有0和1。但代码中所有读写坐标的位置都使用了coord[1]和coord[2],对coord[2]的操作完全超出了数组的合法内存范围,属于栈越界访问。 - 越界访问属于C语言标准定义的未定义行为,程序运行时会直接覆盖数组后方相邻的栈内存数据。当你调整变量声明顺序时,不同变量在栈内存中的排布位置会发生变化,
coord[2]越界写入时覆盖的内存对应的数据也会随之改变,所以会出现coord元素随机变更、程序输出异常甚至直接崩溃的现象,这就是调整变量声明顺序后运行结果大幅变化的直接原因。
修复建议
- 优先修复数组越界问题,二选一即可:
- 方案一:修改数组定义为
int coord[3] = {0, 0};,保留当前coord[1]存行号、coord[2]存列号的写法,调整后下标1、2变为合法访问 - 方案二:把所有代码中的
coord[1]替换为coord[0],coord[2]替换为coord[1],用足现有长度为2的数组的合法下标
- 方案一:修改数组定义为
- 同时修复其他存在风险的代码:
- 替换
gets()函数:该函数没有输入长度校验,早已被C标准移除,存在严重的缓冲区溢出风险,建议替换为fgets(player1, MAX, stdin),读取后手动处理末尾的换行符即可 - 移除
fflush(stdin):对输入流执行fflush属于标准未定义行为,仅对输出流的fflush操作是合法的,如需清空输入缓冲区可以改用循环读取残留字符的方式实现
- 替换
内容的提问来源于stack exchange,提问作者Micio
相关产品推荐
相关产品推荐

