我正在尝试了解未托管代码。我来自C#的背景,我正在玩C ++。
为什么这个代码:
#include <iostream>
using namespace std;
int main()
{
char s[] = "sizeme";
cout << sizeof(s);
int i = 0;
while(i<sizeof(s))
{
cout<<"\nindex "<<i<<":"<<s[i];
i++;
}
return 0;
}
打印出来:
7
index 0:s
index 1:i
index 2:z
index 3:e
index 4:m
index 5:e
index 6:
????
不应该sizeof()返回6?
答案 0 :(得分:15)
C strings是“nul-terminated”,这意味着在结尾处有一个值为0x00
的附加字节。当您调用sizeof(s)
时,您将获得整个缓冲区的大小,包括 nul终结符。当您致电strlen(s)
时,您将获得缓冲区中包含的字符串的长度,不包括nul。
请注意,如果您修改s
的内容并将nul终结符放在除结尾之外的某个位置,那么sizeof(s)
仍然是7(因为这是{{1}的静态属性声明)但s
可能会少一些(因为它是在运行时计算的)。
答案 1 :(得分:3)
不,C中的所有字符串都以空字符(ascii 0)终止。所以s
实际上是7个字节
s i z e m e \0
答案 2 :(得分:2)
这是因为C字符串包含值0
(或'\0'
)作为标记字符串结尾的最后一个字符。
答案 3 :(得分:2)
s是7个字节,6表示字符串,1表示空终止。