You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

sizeof结果是否取决于字符串声明?两种声明的结果差异原因解析

字符数组sizeof结果差异的原因

第一种声明方式(自动推导大小)

测试代码

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;
}

运行结果

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";

运行结果

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

差异原因解析

  • 自动推导大小的情况:当用[]不指定数组长度时,C编译器会根据初始化的字符串字面量自动分配空间——字符串里的5个字符加上字面量自带的\0终止符,总共6个字节。sizeof(str)计算的是数组实际占用的内存,所以返回6。

  • 显式指定大小的情况:你声明数组大小为5,编译器只会把字符串字面量的前5个字符(a到e)复制到数组中,没有多余空间存放\0终止符。此时数组的有效元素只有索引0到4,str[5]属于越界访问,这个位置的0是内存中的随机值(只是这次刚好是0)。sizeof(str)只计算你声明的数组大小,也就是5个unsigned char的字节数,所以返回5。

  • 关于strlen(str)返回5的巧合:strlen的逻辑是从起始位置找\0,直到找到为止。虽然数组内部没有\0,但刚好数组后面的内存位置有个0,所以strlen返回了5。这属于未定义行为,换个环境运行可能得到随机结果甚至崩溃。

内容的提问来源于stack exchange,提问作者Guille

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.27 10:02:59