【发布时间】:2019-05-31 01:48:28
【问题描述】:
在我继续之前,代码如下:
#include <iostream>
using namespace std;
int main() {
char array[] = {'a','b','c'};
cout << array << endl;
return 0;
}
我的系统:
- VisualStudio 2019,默认 C++ 设置
- 使用调试版本而不是发布版本
当我运行此代码示例时,我的控制台输出中会出现类似的内容:
abcXXXXXXXXX
那些 X 代表看似随机的字符。我知道它们来自该地址内存中的现有值,但我不明白为什么我从数组中返回 12 个字节而不是三个字节。
现在,我知道如果我使用 4 个字节长的整数来执行此操作,也许这会有意义,但 sizeof(array) 返回三个(即三个字节长,我知道 sizeof(array) / sizeof(array[0] 技巧。)当我确实尝试过使用整数,我更加困惑,因为我得到了一些四字节的十六进制数字(可能是内存地址?)
这可能是一个微不足道的问题,对不起,但我只是想弄清楚它为什么会这样。请不要使用向量,我在这里尽量保持非 STL。
【问题讨论】:
-
在打印为字符串时,应使用 null 终止字符数组。
-
我知道 nullbytes 是如何工作的,但这并没有改变只有三个字节的事实。如果编译器非常关心我在创建变量时声明了一个大小,为什么它不会在到达软缓冲区末尾时停止读取?
-
试试这个:
cout << array[0] << array[1] << array[2] << endl; -
@Akira 虽然确实存在已知大小的数组,但当您将数组传递给
cout时,数组衰减 到char*指针,即然后期望是一个以空结尾的 C 样式字符串。还要记住,C++ 提供了零保护,防止越界读取数组,当你这样做时可能会发生奇怪的事情。