是否像这样初始化char数组:
char foo[] = {0x31, 0x32, 0x33}; //123
在其末尾添加一个空终止符,以便foo
处的内存数据看起来像0x31323300?还是只是将0x313233写入内存?
而且,无论采用哪种初始化方法,编译器都将foo视作foo字符串一样?
答案 0 :(得分:5)
否,如果您不指定数组的大小并且不使用字符串型字面量作为初始值设定项,则数组的大小和内容将与您拥有的初始值设定项完全匹配。
在您的情况下,数组foo
将恰好是三个char
元素,包含(按顺序)0x31
,0x32
和0x33
。
如果您使用字符串文字作为初始值设定项,则数组将包含终止符。而且,如果您指定的大小大于初始值设定项的数量(例如,示例中的char foo[4]
具有三个初始值设定项),则其余元素将被零初始化(等于字符串终止符)。
还请注意,即使您使用字符串文字作为初始值设定项,但指定的大小比初始值设定项小,该数组也不会终止。
答案 1 :(得分:3)
foo
只是一个普通的老式char
数组,其中包含三个元素,没有空终止符。编译器唯一会“神奇地”添加空终止符的地方是在使用字符串文字时,即使用双引号("
)表示的字符串:
char* string = "I have a null terminator";
答案 2 :(得分:2)
是否像这样初始化char数组:
`char foo [] = {0x31,0x32,0x33}; // 123 是否在其末尾添加了空终止符?
不,它只是一个字符数组。
不管这种初始化方法如何,编译器还将foo当作字符串文字处理foo吗?
否,foo不被视为字符串文字。参见here。