打印char数组的末尾时出现奇怪的结果(`\ 210`)

时间:2013-02-10 08:07:20

标签: c++ c arrays string char

我的代码是这样的:

int main(int argc, char *argv[])
{
    char ca[] = {'0'};
    cout << *ca << endl;
    cout << *(ca+1) << endl;
    cout << ca[1] << endl;
    cout << (char)(0) << endl;
    return 0;
}

结果如下:

 0
 \210
 \210
 ^@

this thread开始,我知道^@实际上与\0相同。但是,\210似乎不是因为我使用hexdump来查看结果。

 bash-3.2$ ./playground | hexdump -C
 00000000  30 0a 88 0a 88 0a 00 0a                           |0.......|
 00000008

可以清楚地看到\21088而不是00

据我了解,ca+1应指向null terminator,即\0。但为什么cout << *(ca+1) << endl;会给我\210作为结果?

2 个答案:

答案 0 :(得分:4)

因为在声明字符数组时必须手动添加空终止符。如果你将它设为字符串(例如在char myString[] = "hi"中),那么它将添加一个空终止符。但是,如果你使用大括号将它设为数组,则不会。

对于0x88字节,它恰好是RAM中的下一个字节,无论出于何种原因。

答案 1 :(得分:2)

在任何有效的C程序中,字符串文字始终为空终止。在这里,您尝试初始化字符数组的单个元素,但只是使用列表初始化语法而不是字符串文字。由于这是使用相同功能分配的静态数组,您甚至可以在sizeof运算符的帮助下进行确认。 做ca应该给你一个,即一个字符数组。但是,如果你做了char ca[] = "0";这样的事情,那么应用sizeof(ca)应该给你2个字符'0'和空终止字符。正如aaaaaa123456789所提到的,这只是你现在得到的输出,只是内存中的另一个字节。如果您在某个不同的时间运行它,您将看到不同的输出或您的程序可能会崩溃。引用不正确的位置可能会导致任何运行时异常。