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

C语言无空终止符char数组用%s输出未报错问题咨询

问题解答

你遇到的这种现象属于C语言中的未定义行为(Undefined Behavior, UB),输出正常没有报错只是巧合,不代表代码本身是正确的。

核心原理

  • printf的%s格式符本身没有数组长度校验能力:它只会从你传入的字符指针地址开始,逐字节读取字符输出,直到读到\0(ASCII值为0的字节)就停止,完全不会主动判断你传入的数组实际长度是多少,也没有义务抛出错误。
  • 你这次能正常输出0123完全是随机结果:只是刚好as[4]数组后方紧邻的内存地址上存储的值是\0,所以读到'3'之后下一个字节就是终止符,输出看起来符合预期。
  • C语言默认不做边界检查:无论是编译器还是运行时,都没有强制要求对数组越界访问、字符串缺少终止符这类问题做错误提示,标准只规定了符合语法和语义规则的代码的运行行为,不符合规则的代码最终表现完全不可预测,不报错、输出乱码、程序崩溃、甚至正常运行都是未定义行为的合法表现。

正确写法参考

如果要把as作为字符串使用,需要至少声明长度为5的数组,末尾留一个位置存\0,示例如下:

#include <stdio.h>

int main()
{
    char as[5];
    *as='0';
    *(as+1)='1';
    *(as+2)='2';
    *(as+3)='3';
    *(as+4)='\0'; // 显式添加字符串终止符
    printf("%s",as);
    return 0;
}

内容的提问来源于stack exchange,提问作者Vembu karthick

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.01 14:18:00