CodeBlocks执行C文件时空char数组出现随机垃圾值问题求助
问题根本原因
- 代码中定义的局部字符数组
userGuesses[27]未做初始化,C语言标准中,栈区的局部非静态变量不会被自动初始化为0值,数组内存里残留的是当前栈空间的历史垃圾数据 - 使用
printf("%s", userGuesses)输出字符串时,要求目标必须以\0作为结束标记,未初始化的数组没有合法的结束标记,printf会一直向后读取内存直到碰到随机的\0为止,就会输出乱码,每次运行栈内容不同所以乱码不一样 - 系统错误提示音是因为垃圾数据中刚好包含ASCII码值为7的响铃字符
\a,输出时就会触发系统提示音 - 笔记本运行正常只是巧合:你笔记本的运行环境中,该数组所在的栈位置刚好残留了
\0值,刚好符合字符串输出的要求,属于未定义行为的随机正确表现,不是代码本身没问题
修复方案
- 定义数组时直接初始化清空:
char userGuesses[27] = {0};
初始化时只要给第一个元素赋值为0,剩下的所有元素都会被自动填充为0,天然就带字符串结束符,不会输出垃圾值
- 每次往数组写入字符后,手动补充结束符:
在userGuesses[counter] = userguess; counter++;这两行之后加一行:
userGuesses[counter] = '\0';
避免后续新增字符后丢失结束标记
补充说明
这个问题和CodeBlocks设置、系统环境变量完全无关,是C语言基础语法层面的未定义行为,不同环境的栈初始状态不同,所以表现不一样,你之前重装软件、改环境变量的操作都是无效的。
内容的提问来源于stack exchange,提问作者M.Hunter
相关产品推荐
相关产品推荐

