• 599查看
  • 0回复

[应用层软件] C语言sizeof和strlen的区别

[复制链接]


该用户从未签到

发表于 10-12-2023 08:17:43 | 显示全部楼层 |阅读模式

汽车零部件采购、销售通信录       填写你的培训需求,我们帮你找      招募汽车专业培训老师


今天分享的内容是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是库函数,其参数是一个指向字符串常量或者字符数组的的指针,用于计算指针指向的字符串的大小,当遇到‘\0’停止计数,不会统计‘\0’。它的用法是strlen(string),其中string是字符串名或字符串常量。例如,strlen("hello")计算的是字符串"hello"的长度,为5。
二、sizeof和strlen的区别

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

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

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

3.1 在一维数组中的使用

#include<stdio.h>#include<string.h>
intmain(){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\r\n",sizeof(arr1));printf("sizeof arr2:%d\r\n",sizeof(arr2));  printf("sizeof arr3:%d\r\n",sizeof(arr3));  printf("sizeof arr4:%d, strlen arr4:%d\r\n",sizeof(arr4), strlen(arr4));printf("sizeof arr5:%d, strlen arr5:%d\r\n",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()遇到‘\0’停止计数,但数组arr4中没有‘\0’,所以会继续往下找,直到遇到‘\0’为止。这里的strlen(arr4) 得到的是一个随机值。

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

输出结果:
sizeof arr1:20sizeof arr2:24sizeof arr3:20sizeof arr4:5, strlen arr4:10sizeof arr5:6, strlen arr5:5

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

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

3.2 在字符串中的使用

例子:

#include<stdio.h>#include<string.h>
intmain(){char *str1="abcde";char str2[]="abcde";char str3[8]={'a',};int str4[8]={'a',};char str5[] = "0123456789";printf("sizeof str1:%d, strlen str1:%d\r\n",sizeof(str1), strlen(str1));printf("sizeof str2:%d, strlen str2:%d\r\n",sizeof(str2), strlen(str2));printf("sizeof str3:%d, strlen str3:%d\r\n",sizeof(str3), strlen(str3));printf("sizeof str4:%d, strlen str4:%d\r\n",sizeof(str4), strlen(str4));printf("sizeof str5:%d, strlen str5:%d\r\n",sizeof(str5), strlen(str5));return0;}

解释:

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

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

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

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

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

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

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

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


快速发帖

您需要登录后才可以回帖 登录 | 注册

本版积分规则

QQ|手机版|小黑屋|Archiver|汽车工程师之家 ( 渝ICP备18012993号-1 )

GMT+8, 4-3-2025 22:26 , Processed in 1.217766 second(s), 31 queries .

Powered by Discuz! X3.5

© 2001-2013 Comsenz Inc.