C语言sizeof和strlen的区别

嵌入式技术

1339人已加入

描述

大家好,我是嵌入式老林,从事嵌入式软件开发多年,今天分享的内容是C语言sizeof和strlen的区别,希望能对你有所帮助

一、sizeof和strlen的介绍

1.1 sizeof

sizeof是C语言中的一个关键字,用于计算数据类型或变量所占用的字节数。它的用法是sizeof(type)或sizeof(variable),其中type是数据类型,variable是变量名。例如,sizeof(int)计算的是int类型变量所占用的字节数,通常是4个字节,而sizeof(float)计算的是float类型变量所占用的字节数,通常是4个字节。

1.2 strlen

strlen是库函数,其参数是一个指向字符串常量或者字符数组的的指针,用于计算指针指向的字符串的大小,当遇到‘’停止计数,不会统计‘’。它的用法是strlen(string),其中string是字符串名或字符串常量。例如,strlen("hello")计算的是字符串"hello"的长度,为5。

二、sizeof和strlen的区别

1,sizeof是运算符,strlen是库函数

2,sizeof是在编译时就计算好了,strlen在运行时计算

3,strlen计算字符串的长度时,遇到‘’停止计数,不会统计‘’;而sizeof统计‘’(在计算字符数组时)

三、sizeof和strlen的举例

3.1 在一维数组中的使用

#include < stdio.h >
#include < string.h >


int main()
{
  int arr1[5] = { 1,2,3,4,5 };
  int arr2[6] = { 1,2,3,4,5 };
  int arr3[] = { 1,2,3,4,5 };
  char arr4[5] = { 'h','e','l','l','o' };
  char arr5[6] = { 'h','e','l','l','o' };
  printf("sizeof arr1:%d
",sizeof(arr1));
  printf("sizeof arr2:%d
",sizeof(arr2));
  printf("sizeof arr3:%d
",sizeof(arr3));
  printf("sizeof arr4:%d, strlen arr4:%d
",sizeof(arr4), strlen(arr4));
  printf("sizeof arr5:%d, strlen arr5:%d
",sizeof(arr5), strlen(arr5));
  return 0;
}

解释:

int类型占4个字节,arr1数组五个元素,所以占20个字节;arr2数组6个元素,所以占24个字节。

这里要注意的是,arr2数组的初始化方式采用的是不完全初始化,数组长度定了,但只有一部分赋值了,未被赋值的元素,系统自动赋初值为0。所以arr2就相当于 int arr2[ 6 ] = { 1 , 2 , 3 , 4 ,5,0 }; 数组arr3是没有指定数组长度,则初始化时赋值了多少个元素,数组的长度即为多少。

sizeof(arr4) 和 sizeof(arr5) ,这个好理解,计算数组占用的空间,char类型1个字节,arr4数组5个元素,arr5数组6个元素,因此sizeof(arr4) 和 sizeof(arr5)分别为5和6

**strlen(arr4) 和 strlen(arr5) **这个看起来可能有点懵,由于对arr4这个数组进行了完全初始化,strlen()遇到‘’停止计数,但数组arr4中没有‘’,所以会继续往下找,直到遇到‘’为止。这里的strlen(arr4) 得到的是一个随机值。

strlen(arr5)对数组进行了不完全初始化,未被赋值的元素,系统自动赋初值为0,字符类型,当然会被赋值为‘’,而strlen计算时,遇到‘’停止计数,但不会统计‘’,所以还是5

输出结果:

sizeof arr1:20
sizeof arr2:24
sizeof arr3:20
sizeof arr4:5, strlen arr4:10
sizeof arr5:6, strlen arr5:5

sizeof一种最常见的用法,就是用来求数组的长度

#define MAX_NUM (sizeof(arr)/sizeof(arr[0]))

3.2 在字符串中的使用

例子:

#include < stdio.h >
#include < string.h >


int main()
{
  char *str1="abcde";
  char str2[]="abcde";
  char str3[8]={'a',};
  int str4[8]={'a',};
  char str5[] = "0123456789";
  printf("sizeof str1:%d, strlen str1:%d
",sizeof(str1), strlen(str1));
  printf("sizeof str2:%d, strlen str2:%d
",sizeof(str2), strlen(str2));
  printf("sizeof str3:%d, strlen str3:%d
",sizeof(str3), strlen(str3));
  printf("sizeof str4:%d, strlen str4:%d
",sizeof(str4), strlen(str4));
  printf("sizeof str5:%d, strlen str5:%d
",sizeof(str5), strlen(str5));
  return 0;
}

解释:

sizeof(str1) 和 strlen(str1) :前者表示计算指针占用的空间,在32位系统指针占4个字节,64位系统,指针占8个字节;我这里是64位系统

strlen(str1)计算字符串长度,这里要注意的是字符串常量时,系统会自动在末尾补‘’,所以这里strlen(str1)为5,不会是个随机值。

sizeof(str2) 和 strlen(str2) :末尾有'',所以sizeof(str2)为6,strlen(str2)为5

sizeof(str3) 和 strlen(str3) :sizeof(str3) 数组8个元素,每个元素占1个字节,所以为8;strlen(str3),8个元素,一个元素为字符'a',其余元素都为'',strlen遇到‘’停止计数,不会统计‘’,所以为1

sizeof(str4) 和 strlen(str4) :sizeof(str4) 数组8个元素,每个元素占4个字节,所以为32;strlen(str4)同strlen(str3)类似。

sizeof(str5) 和 strlen(str5) 跟第二个数组一样,就不解释了。

输出结果:

sizeof str1:8, strlen str1:5
sizeof str2:6, strlen str2:5
sizeof str3:8, strlen str3:1
sizeof str4:32, strlen str4:1
sizeof str5:11, strlen str5:10

当然sizeof也会用来求结构体的字节数,这会涉及到结构体的对齐问题,就不在此处举例说明,后面单独介绍。

打开APP阅读更多精彩内容
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉

全部0条评论

快来发表一下你的评论吧 !

×
20
完善资料,
赚取积分