Windows 7,32位,MSVS 2010
我的理解是,当你这样做时:
char szString[100] = "string";
编译器将需要101个char空间。然后OS将在RAM中分配这101个字符空间。
现在我在szString中放了7个字符(包括null),但是szString的总大小是100.所以我期待打印szString应该导致string
加上从位置szString获取的93个垃圾值[7 ]到szString [99]。但是cout并没有这样做。它只打印string
那么机制是什么?我的理解错了吗?
int main()
{
using namespace std;
char szString[100] = "string";
cout << szString;
return 0;
}
输出
string
答案 0 :(得分:1)
So I am expecting that printing szString should result in string plus 93 garbage values taken from location szString[7] to szString[99].
这是一个错误的假设。字符串是一个由 \ 0 终止的字符数组,在ASCII中称为NUL。
尝试打印最后2个值:
#include <iostream>
#include <cstdio>
using namespace std;
int main()
{
using namespace std;
char szString[100] = "string";
int len1 = szString[5], len2 = szString[6];
cout << len1 << endl;
cout << len2 << endl;
return 0;
}
我们得到ascii值103和0。
答案 1 :(得分:1)
有一篇简短的文章here,但要简要解释一下:
字符序列中表示的字符串文字(例如"string"
)按惯例 null终止,这意味着在创建时\0
(或空字符)是添加到字符串的末尾。
这意味着这一行
char szString[100] = "string";
自动附加到
char szString[100] = "string\0";
这也是(窄)字符串文字比它所拥有的字符数大一个字节的原因:额外字节由\0
占用,表示字符串的结尾。
std::cout
会忽略char
数组中的空字符之后的所有数据,例如szString,因此结果输出只是“string
”。