奇怪结果('\ 210`)打印字符数组的末尾时

问题描述:

我的代码是这样的:奇怪结果(' 210`)打印字符数组的末尾时

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

+0

尝试'char ca [] =“0”;',然后阅读aaaaaa123456789的答案为什么它的工作。 – WhozCraig 2013-02-10 08:30:43

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

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

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