为何连续声明两个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
相关产品推荐
相关产品推荐

