我用下面的测试代码得到了字符数组的大小:

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

我的问题是:造成这种不同结果的原因是什么? 注意,终止字符被正确地放置在最后一个字符串字符之后,从上面的例子中可以看出. 谢谢你的关注.

推荐答案

用作数组str的初始化器的字符串文字"abcde"具有包括终止零字符'\0'在内的6个字符.

但是你只用5个字符显式声明了数组:

unsigned char str[5] = "abcde";
              ^^^^^^  

因此,如何初始化数组甚至不重要,因为你明确指定了数组的大小等于5,而sizeof( unsigned char )总是等于1.所以sizeof( str )显然等于5.

注意,在这种情况下,数组不包含字符串,因为它不能容纳字符串字面量的终止零字符'\0'.例如,调用数组的函数strlen调用未定义的行为.

C++中的C相反,这样的声明是无效的.在C++课上,你至少应该写下

unsigned char str[6] = "abcde";

或者当您编写数组的第一个声明时,如下所示

unsigned char str[] = "abcde";

在最后一种情况下,数组中的元素数等于字符串中的字符数.

此外,要输出类型size_t的值,您应该使用转换说明符zu而不是lu,因为一般来说,类型size_t不一定是类型unsigned long的别名.在某些系统中,它可以是类型unsigned long long的别名.

C标准(7.19通用定义stddef. h)<>

推荐规程

4用于SIZE_t和ptrdiff_t的类型不应包含整数 转换排名高于带符号的长整型整数unless the implementation supports objects large enough to make this necessary.

所以你需要写下

printf("sizeof(str)=%zu\nstrlen(str)=%zu\n", sizeof(str), strlen(str));

C++相关问答推荐

如何将匿名VLA分配给指针?

CC crate 示例不会与C函数链接

C中空终止符后面的数字?

ATTiny1606定时器TCA 0中断未触发

有没有可能我不能打印?(C,流程)

如何将常量char*复制到char数组

致命:ThreadSaniizer:在Linux内核6.6+上运行时意外的内存映射

N的值设置为0或1(未定义的行为),而我正在try 学习realloc和Malloc的用法

为什么此共享库没有预期的依赖项?

是否可以通过调用两个函数来初始化2D数组?示例:ARRAY[STARTING_ROWS()][STARTING_COLUMNS()]

不同出处的指针可以相等吗?

如何读取文件并将内容保存在字符串中?(在C语言中,没有崩溃或核心转储错误)

将变量或参数打包到 struct /联合中是否会带来意想不到的性能损失?

不同原型的危险C函数是可能的

将数组插入数组

为什么realloc函数在此代码中修改变量?

将数字的每一位数平方,并使用C将它们连接为一个数字(程序不能正确处理0)

意外的C并集结果

使用mmap为N整数分配内存

如何使用 raylib 显示数组中的图像