是否会自动插入空字符?

时间:2013-12-17 21:13:56

标签: c++ arrays string initialization string-literals

C ++编译器是否应该在char数组结束后自动插入空字符?以下打印“Word”。那么C ++编译器会自动在数组的最后位置插入一个空字符吗?

int main()
{
    char x[] = {'W', 'o', 'r', 'd'};
    cout << x << endl;
    return 0;
}

7 个答案:

答案 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" };