C++ 打印字符数组结尾时的Wierd结果(`\210`)

C++ 打印字符数组结尾时的Wierd结果(`\210`),c++,c,arrays,string,char,C++,C,Arrays,String,Char,我的代码如下: 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 \21

我的代码如下:

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
似乎不是因为当我使用
hextump
查看结果时

 bash-3.2$ ./playground | hexdump -C
 00000000  30 0a 88 0a 88 0a 00 0a                           |0.......|
 00000008
可以清楚地看到,
\210
88
而不是
00


据我所知,
ca+1
应该指向一个
空终止符
,即
\0
。但是为什么
不能,因为在声明字符数组时必须手动添加空终止符。如果将其设置为字符串(例如在
char myString[]=“hi”
),则它将添加一个空终止符。但是,如果将其设置为带有大括号的数组,则它不会


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

因为在声明字符数组时必须手动添加空终止符。如果将其设置为字符串(例如在
char myString[]=“hi”
),则它将添加一个空终止符。但是,如果将其设置为带有大括号的数组,则它不会


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

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

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

尝试
char ca[]=“0”,然后阅读AAAAA123456789的答案,了解其工作原理,然后阅读AAAAA123456789的答案,了解它为什么有效。