C语言定义char数组存储姓名后printf输出自带笑脸符号问题排查
异常原因
C语言中字符串必须以\0(空终止符)作为结束标识,printf的%s格式控制符会从传入的首地址开始不断向后读取内存,直到遇到\0才会停止输出。
你定义的name数组长度为5,而字面量"Rafik"刚好包含R、a、f、i、k共5个字符,这种情况下编译器不会自动在数组末尾追加\0,导致name不属于合法的C语言字符串。printf输出完数组内的5个字符后,会继续读取数组后方的内存内容,你看到的笑脸符号恰好是这段内存中存储的数值对应的ASCII可显示字符(ASCII值1对应的输出就是笑脸),因此出现了额外的异常输出。
修复方案
- 方案1:省略数组长度声明,让编译器自动计算所需空间:
char name[] = "Rafik";
编译器会自动将数组长度设置为6,额外预留1个字节存储\0,保证字符串合法性。
- 方案2:手动将数组长度设置为至少6,预留空终止符的存储位置:
char name[6] = "Rafik";
- 方案3:如果必须保持数组长度为5,可以通过
printf的精度参数限制输出长度,避免越界读取内存:
printf("%.5s", name);
内容的提问来源于stack exchange,提问作者user16573783
相关产品推荐
相关产品推荐

