使用%s格式符打印未以'\0'终止的字符数组为何出现乱码?
关于printf打印无'\0'终止字符数组出现乱码的问题
测试代码
char x[]={'i',' ' ,'l','i','k','e',' ','c','!'}; printf("%s",x);
执行结果
i like c!�@i like c!�@
疑问
使用printf的%s格式符打印未以'\0'终止的字符数组,预期会报错但并未发生,反而出现额外乱码,这是为什么?
原因解析
printf的%s格式符的工作逻辑是:从传入的起始内存地址开始,逐个输出字符,直到遇到'\0'(空字符)才停止。- 你定义的数组
x只初始化了9个字符,没有显式添加'\0',数组的长度就固定为9。当printf打印完数组内的所有字符后,会继续读取数组之后的内存空间(这属于C语言里的未定义行为),直到碰巧读到某个'\0'才会停止输出。 - 那些乱码就是数组后续内存里的随机数据,甚至可能把栈上的其他内容也读出来重复打印(比如你结果里重复出现的"i like c!"),具体输出什么完全取决于程序运行时的内存状态,每次运行结果都可能不同。
- 没报错是因为C语言本身不会主动检查这种内存越界访问,普通编译模式下编译器也不一定能检测到这类问题。程序不会直接"报错崩溃",但这种行为完全不可控,后续很可能引发各种诡异的程序问题。
内容的提问来源于stack exchange,提问作者Adam z
相关产品推荐
相关产品推荐

