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
相关产品推荐
相关产品推荐

