我使用以下测试代码获取str字符数组的大小:
int main()
{
unsigned char str[] = "abcde";
for(int j = 0; j <= 6; j++) {
printf("str[%u]=%c; %i\n", j, *(str+j), *(str+j));
}
printf("sizeof(str)=%lu\nstrlen(str)=%lu\n", sizeof(str), strlen(str));
return 0;
}
结果是 6,正如预期的那样,如下面的屏幕输出所示:
str[0]=a; 97
str[1]=b; 98
str[2]=c; 99
str[3]=d; 100
str[4]=e; 101
str[5]=; 0
str[6]=; 0
sizeof(str)=6 //here it is!
strlen(str)=5
但是,如果我在其声明中明确包含字符串维度 (5),如下所示:
unsigned char str[5] = "abcde";
现在 sizeof 的结果是 5 而不是预期的 6,从函数输出可以看出:
str[0]=a; 97
str[1]=b; 98
str[2]=c; 99
str[3]=d; 100
str[4]=e; 101
str[5]=; 0
str[6]; 8
sizeof(str)=5 // why 5 and not 6???
strlen(str)=5
我的问题:造成不同结果的原因是什么? 请注意,终止字符正确放置在最后一个字符串字符之后,如上面的示例所示。 感谢您的关注。
strlen(str)
在第二种情况下是未定义的行为。
请注意,终止字符正确放置在最后一个字符串字符之后,如上面的示例所示。
不,不是。根据 C11 6.7.9 14:
字符类型数组可以由字符串文字或UTF-8字符串初始化 文字,可以选择用大括号括起来。字符串文字的连续字节(包括 如果有空间或者数组大小未知则终止空字符)初始化 数组的元素。
没有空间容纳终止空字符,因此不添加它。因此
sizeof
的结果是不同的。