为何以单个字符初始化的char数组不像字符串字面量那样以空终止符结尾?
为什么单个字符初始化的char数组没有空终止符?
这其实是C++(以及它的前身C)针对不同使用场景设计的初始化逻辑,核心是区分普通字符数组和C风格字符串:
1. 逐个字符初始化:严格按你给出的元素创建数组
当你写:
char text[] = { 'h', 'e', 'l', 'l', 'o' };
编译器会完全按照你显式列出的元素数量来分配数组空间——这里你写了5个char,所以数组大小就是5字节,不会自动添加任何额外内容。
这种初始化方式的定位是创建一个「纯粹的字符集合」,它不一定是用来做字符串的:你可能用它存储二进制数据、加密后的字符片段,或者只是一组不需要被字符串函数处理的字符序列。编译器不会假设你需要空终止符,毕竟不是所有char数组都要当字符串用。
2. 字符串字面量初始化:专为C风格字符串设计
而当你用字符串字面量初始化时:
char text2[] = "hello";
字符串字面量"hello"在内存中本身就自带一个隐藏的空终止符\0——也就是说,它实际存储的是'h' 'e' 'l' 'l' 'o' '\0'这6个字符。编译器会把整个字面量(包括\0)复制到数组里,所以数组大小是6字节。
C风格字符串的定义就是「以\0结尾的char数组」,这样像cout、strlen这类处理字符串的函数才能知道在哪里停止读取,避免越界访问。
小提示:手动添加空终止符
如果你想让逐个字符初始化的数组也能被当作C风格字符串使用,只需要手动在末尾加上\0就行:
char text[] = { 'h', 'e', 'l', 'l', 'o', '\0' };
这时sizeof(text)会变成6,和text2一样,也能被字符串函数正确处理了。
内容的提问来源于stack exchange,提问作者Chris Gray
相关产品推荐
相关产品推荐

