首页 > 解决方案 > 声明顺序重叠的字符数组

问题描述

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

#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++c++11c++14c++17

解决方案


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

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

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

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

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


推荐阅读