奇怪结果('\ 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
可以清楚地看出,\210
是88
而不是00
。
据我所知,ca+1
应指向null terminator
,这是\0
。但为什么cout << *(ca+1) << endl;
结果给我\210
?
答
因为在声明字符array时必须手动添加空终止符。如果你使它成为字符串(如在char myString[] = "hi"
),那么它将添加一个空终止符。但是,如果你使它成为一个数组,与大括号,它不会。
至于0x88字节,它恰好是RAM中的下一个字节,无论出于何种原因。
答
在任何有效的C程序中,字符串文字总是以null结尾。这里您试图初始化字符数组的个别元素,但仅使用列表初始化语法而不是字符串文字。由于这是使用相同函数分配的静态数组,所以您甚至可以在sizeof运算符的帮助下进行确认。 做ca
应该给你1即一个字符数组。然而,如果你已经做了类似char ca[] = "0";
那么应用sizeof(ca)
应该给你2即字符'0'和空终止字符。作为aaaaaa123456789提到,这只是一个输出,现在你正在获得,只是在内存中的另一个字节。如果你在某个不同的时间运行它,你会看到不同的输出,或者你的程序可能会崩溃。引用错误的位置可能导致任何运行时异常。
尝试'char ca [] =“0”;',然后阅读aaaaaa123456789的答案为什么它的工作。 – WhozCraig 2013-02-10 08:30:43