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

为何连续声明两个char数组时,第一个数组末尾无'\0'?

为什么用花括号初始化的char数组有时没有自动添加'\0'?

首先明确C语言的核心规则:

当使用花括号逐个字符初始化char数组时,数组的大小严格等于初始化列表中元素的个数,编译器不会自动在末尾添加字符串结束符'\0'。只有当用双引号包裹的字符串字面量(如char s[] = "hello";)初始化时,编译器才会自动在数组末尾追加'\0'。

你的现象解释

你单独声明s1时看到的“末尾有'\0'”其实是巧合——栈内存中s1后面的区域刚好存在一个值为0的字节(可能是栈上的残留数据),所以printf用%s打印时能正常截断。但当你同时声明s2时,s2的内存紧邻s1,此时s1后面没有多余的0字节,printf就会从s1的起始地址一直读取,直到遇到s2末尾的'\0',于是就把s1和s2的内容连在一起输出了。

解决方法

  • 手动在初始化列表末尾添加'\0':
    char s1[] = {'h', 'e', 'l', 'l', 'o', '\0'};
    char s2[] = {'w', 'o', 'r', 'l', 'd', '\0'};
    
  • 指定数组大小,让编译器自动填充剩余元素为0(即'\0'):
    char s1[6] = {'h', 'e', 'l', 'l', 'o'};
    char s2[6] = {'w', 'o', 'r', 'l', 'd'};
    
  • 更推荐的方式是用字符串字面量初始化,编译器会自动处理'\0':
    char s1[] = "hello";
    char s2[] = "world";
    

内容的提问来源于stack exchange,提问作者Harrison Rankin

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.23 12:12:11