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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.27 20:45:03