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

