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

C语言中printf("%s")为何输出汉字?无终止符字符数组的疑问

问题解析

首先看代码的核心问题:

char str[5] = "Hello";
printf("%s", str);

"Hello"包含5个ASCII字符,刚好把str数组填满,所以数组末尾没有自动添加字符串结束符'\0'。而printf("%s")的工作逻辑是从指定地址开始逐字节输出,直到遇到'\0'才停止,这就导致它会越界读取str数组之后的内存内容——这些都是未定义的垃圾数据。

至于为什么会显示出汉字“儆”,和printf本身无关,是终端的字符编码解析规则导致的:

  • 汉字属于多字节字符(比如UTF-8下一个汉字占3字节,GBK下占2字节),终端会把连续的字节序列按照当前系统的默认编码(如UTF-8、GBK)去匹配解析。
  • 越界读出来的垃圾字节刚好凑成了“儆”对应的多字节编码组合,终端就把这段字节序列显示成了这个汉字,这完全是随机巧合,不是printf识别了Unicode。

本质就是:printf只是无脑输出字节流,终端才负责把字节转成可见字符显示,乱码字节刚好凑成了合法的汉字编码而已。

内容的提问来源于stack exchange,提问作者minyong kw

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.09 17:27:08