【发布时间】:2020-03-04 03:19:24
【问题描述】:
非常简单的代码,输出我看不懂...
#include <iostream>
using namespace std;
int main() {
char text1[] = {'v', 'e', 'r', 'y'};
cout << text1 << endl;
char text2[] = "strange";
cout << text2 << endl;
return 0;
}
由于某种原因,我得到了这个输出:
very�>��
奇怪
每次输出为“非常”时,第二个数组中的字符数量相同。如果我将第一行更改为
,则此输出正确char text1[] = "very";
或者如果我不声明和计算第二个数组。
必须与使用 {'', '', '', ...} 初始化 char 的方式有关。我注意到在这种情况下 sizeof(text1) 是 4 并且在使用的情况下 char text1[] = "非常"; sizeof(text1) 为 5,最后一个位置留空。声明第二个 char 时,第一个 char sizeof 仍然准确,但是第二个 char 位于内存中第一个 char 之后的位置。
如果我这样重写程序...
int main() {
char text1[] = {'v', 'e', 'r', 'y'};
char text2[] = "strange";
cout << text1 << endl;
cout << text2 << endl;
return 0;
}
输出变成:
verystrange
strange
似乎如果我声明更多的 char 数组,它总是将最后一个放在第一个 (text1[]) 之后,并且它会在内存中向前碰撞其他的以腾出空间。它只发生在使用 {};初始化。 真的只是想知道这里发生了什么...我看不出这会导致编写良好的程序出现任何问题。
【问题讨论】:
-
您是否碰巧在您的 C 或 C++ 书籍的某处遇到纯字符文本字符串必须以空字节或
'\0'结尾?因为这是 C 和 C++ 处理纯文字字符串的唯一方式? -
cout << <char *>需要一个以空字符结尾的字符串,并且您的第一个char[]数组不是以空字符结尾的。你的第二个是。 -
这能回答你的问题吗? C String Null Zero?
-
要明确,如果我只声明一个字符数组,输出是正常的。只有当程序在 main() 中的任何位置声明第二个数组时,程序才会对第一个数组上的额外字符进行加扰。
-
@CrazyDiamond 仅使用一个数组时不打印垃圾的唯一原因是第一个数组后面的内存恰好是
0s(可能是因为您正在使用调试进行编译标志?)。当您使用两个数组时,第二个数组在堆栈内存中跟随第一个数组,因此运行时无法判断第一个数组的结束位置和第二个数组的开始位置。
标签: c++ arrays char output cout