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

C语言中字符数组无空终止符时printf输出的行为疑问

关于C语言字符数组初始化与printf("%s")的行为分析
  • 你判断这段代码属于未定义行为完全正确,那些称固定输出Sca的资料并不严谨。
  • 用字符串字面量初始化固定大小字符数组的规则是:如果数组长度小于字面量的字符数(不含结尾的'\0'),编译器只会把字面量的前N个字符(N为数组大小)拷贝到数组中,不会自动添加空终止符。比如你写的char str[3] = "Scaler.";,数组里只会存入'S'、'c'、'a','\0'根本没有存储空间。
  • printf("%s")的工作逻辑是从传入地址开始逐个输出字符,直到遇到'\0'才停止。因为你的str数组里没有这个终止符,它会越界读取数组后的内存内容——这就是标准定义的未定义行为,输出结果完全不确定:可能刚好后续内存里有'\0'就只输出Sca,可能输出一串乱码,甚至程序直接崩溃都有可能。
  • 你问的“空终止符会存在于最后一个索引吗”:答案是不会。只有当数组大小大于等于字面量总长度(包含'\0')时,编译器才会把'\0'加入数组;如果数组大小刚好等于字面量的字符数(不含'\0'),同样不会添加'\0'。所以你的代码里不可能稳定输出Sc,除非数组后恰好有'\0',但这是随机巧合,不是必然结果。

内容的提问来源于stack exchange,提问作者Blue Apricot

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.06 16:32:16