0

我的代码是这样的:

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
 ^@

这个线程,我知道这和实际上^@是一样的\0。但是,\210似乎不是因为当我使用hexdump查看结果时。

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

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

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

4

2 回答 2

4

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

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

于 2013-02-10T08:10:32.973 回答
2

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

于 2013-02-10T09:28:08.457 回答