sizeof 结果取决于字符串的声明吗?

问题描述 投票:0回答:1

我使用以下测试代码获取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

我的问题:造成不同结果的原因是什么? 请注意,终止字符正确放置在最后一个字符串字符之后,如上面的示例所示。 感谢您的关注。

arrays c sizeof
1个回答
0
投票

strlen(str)
在第二种情况下是未定义的行为。

请注意,终止字符正确放置在最后一个字符串字符之后,如上面的示例所示。

不,不是。根据 C11 6.7.9 14:

字符类型数组可以由字符串文字或UTF-8字符串初始化 文字,可以选择用大括号括起来。字符串文字的连续字节(包括 如果有空间或者数组大小未知则终止空字符)初始化 数组的元素。

没有空间容纳终止空字符,因此不添加它。因此

sizeof
的结果是不同的。

© www.soinside.com 2019 - 2024. All rights reserved.