C ++编译器是否应该在char数组结束后自动插入空字符?以下打印“Word”。那么C ++编译器会自动在数组的最后位置插入一个空字符吗?
int main()
{
char x[] = {'W', 'o', 'r', 'd'};
cout << x << endl;
return 0;
}
答案 0 :(得分:5)
不,它没有。您的数组x
只有4个元素。您正在向std::cout
传递指向char
的指针,该指针不是以空字符结尾的字符串的开头。这是未定义的行为。
例如,在我的平台上,类似的代码打印Word?
,带有虚假的问号。
答案 1 :(得分:4)
在C / C ++中,字符串文字自动附加终止零。所以如果你要写例如
char x[] = "Word";
然后数组的大小将等于5,数组的最后一个元素将包含'\ 0'。
当您显示时使用以下记录
char x[] = {'W', 'o', 'r', 'd'};
然后编译器分配与初始化器数量完全相同的元素数。在这种情况下,数组只有4个元素。
但是如果你要写下面的方式
char x[5] = {'W', 'o', 'r', 'd'};
然后第五个元素将包含终止零,因为它没有相应的初始值并且将被初始化为零。
还要考虑以下记录在C中有效但在C ++中无效
char x[4] = "Word";
答案 2 :(得分:3)
这是未定义的行为,它打印出“Word”,因为它也可能已经崩溃。
答案 3 :(得分:1)
不,不。如果你想将它用作字符串,或者你想将字符串函数用于字符串,那么你自己必须这样做。
答案 4 :(得分:1)
不,它没有。如果要自动插入,请使用字符串常量:
const char *x = "Word";
//OR
std::string const s = "Word";
const char *x = s.c_str();
//OR
char x[] = { "Word" }; //using the C++11 brace initializer syntax.
验证这一点的最简单方法是使用调试器查看x的内存地址并监视它以及后续的几个字节。初始化后停止调试器并检查内存内容。
答案 5 :(得分:0)
不,在这种情况下,您只是创建一个非空终止数组。在基于空终止的读取的情况下。你的程序不会停止,因为它最终找不到null。
char x[] = "Word";
在这种情况下,将为x分配5个字节。最后是空的。
答案 6 :(得分:0)
不,如果您想将char
数组用作字符串,请使用此形式的初始化程序
char x[] = { "Word" };