按顺序声明的字符数组重叠

Character arrays declared sequentially overlapping

本文关键字:数组 重叠 字符 顺序 声明      更新时间:2023-10-16

我正在尝试声明两个字符数组,一个接一个。当我这样做时,数组似乎相互重叠。

#include <iostream>
int main(){
char cmnd[2] = {'l', 's'};
char flags[1] = {'a'};
std::cout << "cmnd array: " << cmnd << std::endl;
std::cout << "flags array: " << flags << std::endl;
}

然后,此代码的输出变为:

cmnd array: ls
flags array: als

根据输出,我的标志数组应该只包含{'a'}实际上包含{'a','l','s'}
为什么会这样?提前感谢您对此问题的任何见解。

C++所有纯char字符串实际上都称为以 null 结尾的字节字符串。

这个 null 终止符告诉所有处理此类字符串的函数字符串在哪里结束。如果字符串缺少 null 终止符,它们将超出界限,并且您将具有未定义的行为

如果要将字符数组用作字符串,则需要确保它们包含 null 终止符。在您的情况下,这非常简单:不要指定数组的大小,并在初始化时使用文字字符串:

char cmnd[] = "ls";
char flags[] = "a";

现在cmnd将是一个由三个字符组成的数组,并初始化为包含'l''s'和 null 终止符''。同样flags将是一个由两个字符组成的数组,初始化为'a'''

std::cout

将字符数组视为字符串,但这两个字符数组都不以 NULL 结尾,但cout继续,直到找到 NULL 字符。看起来您的flags数组紧挨着内存中的cmnd数组,而紧跟在cmnd数组之后的内存位置中出现 0。

如果要将它们视为要std::cout的字符串,请在每个数组的末尾添加一个空字符,即"\0"或仅 0。如果没有,请更改将它们传递给cout的方式。