C++ 在声明中初始化时,字符数组上cout的奇怪输出?仅当我在这个数组之后声明另一个数组时才会发生

C++ 在声明中初始化时,字符数组上cout的奇怪输出?仅当我在这个数组之后声明另一个数组时才会发生,c++,arrays,char,output,cout,C++,Arrays,Char,Output,Cout,非常简单的代码,输出我不懂 #include <iostream> using namespace std; int main() { char text1[] = {'v', 'e', 'r', 'y'}; cout << text1 << endl; char text2[] = "strange"; cout << text2 << endl; return 0; } 奇怪的

非常简单的代码,输出我不懂

#include  <iostream>

using namespace std;

int main() {

    char text1[] = {'v', 'e', 'r', 'y'};
    cout << text1 <<  endl;
    char text2[] = "strange";
    cout << text2 << endl;

    return 0;
}
奇怪的

每次输出为“very”时,在第二个数组中后跟相同数量的字符。如果我将第一行更改为

char text1[] = "very";
或者如果我没有声明并不能创建第二个数组

必须与用{“”,'',…}初始化字符的方式有关。。我注意到,在本例中,sizeof(text1)是4,在使用 char text1[]=“非常”; sizeof(text1)为5,最后一个位置留空。当声明第二个字符时,第一个字符sizeof仍然是准确的,但是第二个字符紧跟在内存中第一个字符之后

如果我像这样重写程序

int main() {

    char text1[] = {'v', 'e', 'r', 'y'};
    char text2[] = "strange";
    cout << text1 <<  endl;
    cout << text2 << endl;

    return 0;
}
似乎如果我声明更多的字符数组,它总是在第一个字符(text1[])之后插入最后一个字符,并在内存中向前移动其他字符以腾出空间。它只在使用{}时发生;初始化。
真的只是想知道这里发生了什么。。。在一个编写良好的程序中,我看不出这会导致任何问题。

为了总结注释中的响应,在C中,“字符串”没有相关的长度。相反,“字符串”的结尾由尾随的空字符表示,即
0

使用初始化字符数组时

char text1[] = {'v', 'e', 'r', 'y'};

您可以创建一个正好由四个字符组成的数组,其中没有尾随null。如果您试图将这个“字符串”传递给一个函数,它期望一个后缀为空的分隔字符串,例如<代码> STD::CUT::操作符,你碰巧碰到C或C++书籍中的某个地方,普通字符字符串必须以null字节结尾,或者<代码> 0”< /代码>?因为这是C和C++与纯文字字符串一起工作的唯一方法吗?<代码> CUT,这能回答你的问题吗?要清楚,如果我只声明一个字符数组,输出是正常的。只有当程序在main()中的任何位置声明第二个数组时,程序才会对第一个数组上的额外字符进行置乱。@CrazyDiamond仅使用一个数组时不打印垃圾的唯一原因是第一个数组后面的内存恰好是
0
s(可能是因为您使用调试标志进行编译?)。当您使用两个数组时,第二个数组跟随堆栈内存中的第一个数组,因此运行时无法判断第一个数组的结束位置和第二个数组的开始位置。
verystrange

strange
char text1[] = {'v', 'e', 'r', 'y'};