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

Ren*_*res 2 c++ c++11 c++14 c++17

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

#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;
}
Run Code Online (Sandbox Code Playgroud)

此代码的输出然后变为:

cmnd array: ls
flags array: als
Run Code Online (Sandbox Code Playgroud)

根据输出,我的 flags 数组应该只包含{'a'}实际上包含{'a','l','s'}.
为什么会出现这种情况?预先感谢您对此问题的任何见解。

Som*_*ude 7

在 C++ 中,所有纯char字符串实际上都称为空终止字节字符串

这个空终止符告诉所有处理此类字符串的函数,该字符串在何处结束。如果字符串缺少空终止符,它们将越界,并且您将有未定义的行为

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

char cmnd[] = "ls";
char flags[] = "a";
Run Code Online (Sandbox Code Playgroud)

现在cmnd将阵列3个字符,并且初始化为包含'l''s'和空终止'\0'。同样flags将是一个由两个字符组成的数组,初始化为'a''\0'