我的代码是这样的:
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
作为结果?
答案 0 :(得分:4)
因为在声明字符数组时必须手动添加空终止符。如果你将它设为字符串(例如在char myString[] = "hi"
中),那么它将添加一个空终止符。但是,如果你使用大括号将它设为数组,则不会。
对于0x88字节,它恰好是RAM中的下一个字节,无论出于何种原因。
答案 1 :(得分:2)
在任何有效的C程序中,字符串文字始终为空终止。在这里,您尝试初始化字符数组的单个元素,但只是使用列表初始化语法而不是字符串文字。由于这是使用相同功能分配的静态数组,您甚至可以在sizeof运算符的帮助下进行确认。
做ca
应该给你一个,即一个字符数组。但是,如果你做了char ca[] = "0";
这样的事情,那么应用sizeof(ca)
应该给你2个字符'0'和空终止字符。正如aaaaaa123456789所提到的,这只是你现在得到的输出,只是内存中的另一个字节。如果您在某个不同的时间运行它,您将看到不同的输出或您的程序可能会崩溃。引用不正确的位置可能会导致任何运行时异常。