打印字符数组末尾时的Wierd结果(“210”)

Wierd result (`210`) when printing the end of a char array

本文关键字:结果 Wierd 数组 字符 打印      更新时间:2023-10-16

我的代码如下:

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

从这个线程中,我知道^@实际上和是一样的。然而,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,也就是。但为什么cout << *(ca+1) << endl;会给我210作为结果呢?

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

至于0x88字节,不管出于什么原因,它恰好是RAM中的下一个字节。

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