按顺序声明的字符数组重叠
Character arrays declared sequentially overlapping
我正在尝试声明两个字符数组,一个接一个。当我这样做时,数组似乎相互重叠。
#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
的方式。
相关文章:
- Mongodb c++驱动程序:如何查询元素的数组
- 将数组的地址分配给变量并删除
- 从C++本机插件更新Vector3数组
- lambda参数转换为constexpr技巧,然后获取带链接的数组
- 将数组作为参数传递给函数安全吗?作为第三方职能部门,可以探索他们想要的之外的其他元素
- 数组索引的值没有增加
- 将对象数组的引用传递给函数
- 为char数组调整zlib-zpipe
- 2D数组来自文本输入,中间有空格
- std::向量与传递值的动态数组
- 在c++中用vector填充一个简单的动态数组
- 使用strcpy将char数组的元素复制到另一个数组
- 按顺序声明的字符数组重叠
- 非重叠连续子数组的最大长度总和
- 重叠的多维数组损坏
- 指针到数组重叠数组的末端
- 在检查二维字符数组中的重叠时遇到麻烦
- 2D矢量,数组中的重叠和不同类型的对象
- 重叠数组的和,自动向量化,和限制
- 将1-d数组转换为重叠的2-d数组