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

使用%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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.14 17:22:02