手把手教你搞懂sizeof与strlen

"这篇博客详细介绍了C语言中strlen()函数和sizeof运算符的区别。strlen计算字符串长度,不包括'',而sizeof计算内存占用,包括''。通过多个示例,解释了在不同情况下的运用,如普通字符串、初始化数组、指针等。同时,还展示了源代码以直观展示结果。"
摘要由CSDN通过智能技术生成

 

 

目录

 ​编辑

一、普通的字符串

二、已初始化数组元素个数的数组

 三、用temp3指向并定义了这样一个字符串常量.

 四、‘\0’对数组的影响

这也正是strlen与sizeof最主要的区别了一个是求所占内存空间的大小,在计算字符转的大小是是会包含 ‘\0’ 的;而另一个是求字符串长度的,是不包含 ‘\0’ 的。

 五、我们使用sizeof来计算数组元素个数

 六、strlen是一个库函数,只能以char*(字符串)做参数,而且 要想得到的结果正确必须包含'\0';

 七、源码:


一、普通的字符串

首先了解一下双引号这个东西,字符串常量两边必须要加上双引号,字符串常量存放在静态区,并且这个双引号会给这串字符串的末尾补上一个‘\0’;就如下图看到的最后一个元素时‘\0’而不是‘f’;

对于我们的sizeof这是一个运算符,他可以计算变量或者类型的字节大小,即变量所有元素的字节 大小之和。这里使用的是char字符所以每一个元素大小为1字节,一共也就是7个字节。

而strlen()函数计算的是字符串中字符长度。也就是我们可以看到的abcdef这六个字符的长度,大小为6;strlen函数实际上是通过'\0'结束符来计算字符长度的。


二、已初始化数组元素个数的数组

temp2字符数组中只有7个元素,所以它的strlen()计算下来就是7.

再看看sizeof的结果,为什么是40?

 我们将temp2展开,下面的结果一目了然,temp2为一个初始了40个char类型元素的数组,除了赋入的字符串,其他元素全为‘\0’,所以最终的sizeof计算结果就为40.

 


 三、用temp3指向并定义了这样一个字符串常量.

 

 前面说过sizeof的作用是来计算变量或者类型的字节大小,而这里的temp3为一个指针我们知道在32位操作系统下指针为4个字节,64位操作系统下指针为8个字节。所以这里的sizeof为4.


 四、‘\0’对数组的影响

这也正是strlen与sizeof最主要的区别了一个是求所占内存空间的大小,在计算字符转的大小是是会包含 ‘\0’ 的;而另一个是求字符串长度的,是不包含 ‘\0’ 的。

 该例子中temp4数组没有‘\0’元素,他的字节数也就说所包含的五个元素的字节数之和,为5.

然而这里的strlen因为没有识别到'\0'元素,导致结果是一个随机值。

 上下对比一下可以看到strlen对于'\0'元素的识别作用。

 0的ASCII码值类48,也不能作为strlen判断结束的标志。
 

 五、我们使用sizeof来计算数组元素个数

 六、strlen是一个库函数,只能以char*(字符串)做参数,而且 要想得到的结果正确必须包含'\0';

 七、源码:

int main()
{
    char temp1[] = { "adcdef" };
    puts(temp1);
    printf("%d\n", sizeof(temp1));
    printf("%d\n", strlen(temp1));

    char temp2[40] = "sdafdsa";
    puts(temp2);
    printf("%d\n", sizeof(temp2));
    printf("%d\n", strlen(temp2));

    const char* temp3 = "abcdef";
    puts(temp3);
    printf("%d\n", sizeof(temp3));
    printf("%d\n", strlen(temp3));

    char temp4[] = { 'a','b','c','d','e' };
    puts(temp4);
    printf("%d\n", sizeof(temp4));
    printf("%d\n", strlen(temp4));

    char temp5[] = { 'a','b','c','d','e','\0'};
    puts(temp5);
    printf("%d\n", sizeof(temp5));
    printf("%d\n", strlen(temp5));

    char temp6[] = { 'a','b','c','d','e','0' };
    puts(temp6);
    printf("%d\n", sizeof(temp6));
    printf("%d\n", strlen(temp6));

    int num[20];
    printf("%d\n", sizeof(num));
    printf("%d\n", sizeof(num) / sizeof(int));
    printf("%d\n", sizeof(num) / sizeof(num[0]));
    //printf("%d\n", strlen(num));
    return 0;
}

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值