前往小程序,Get更优阅读体验!
立即前往
发布
社区首页 >专栏 >【C语言指南】sizeof与strlen的使用及其区别

【C语言指南】sizeof与strlen的使用及其区别

作者头像
用户11396077
发布2024-12-06 18:40:30
发布2024-12-06 18:40:30
18400
代码可运行
举报
文章被收录于专栏:C/C++指南C/C++指南
运行总次数:0
代码可运行

一、 sizeof

1. sizeof简介

sizeof是一个编译时运算符,可用于任何变量名、类型名或常量值,当用于变量名或常量时,它不需要用圆括号。 它在编译时起作用,而不是运行时。 sizeof是⽤来计算sizeof的操作符数的类型长度的,单位是字节。 返回值是size_t 类型 在printf函数中使用%zd打印

sizeof 运算符的返回值,C语⾔只规定是⽆符号整数,并没有规定具体的类型,⽽是留给系统⾃⼰去决定, sizeof 到底返回什么类型。不同的系统中,返回值的类型有可能是unsigned int ,也有可能是 unsigned long ,甚⾄是 unsigned long long ,对应的 printf() 占位符分别是 %u 、 %lu 和 %llu 。这样不利于程序的可移植性。

C语⾔提供了⼀个解决⽅法,创造了⼀个类型别名 size_t ,⽤来统⼀表⽰ sizeof 的返回值类型。对应当前系统的 sizeof 的返回值类型,可能是 unsigned int ,也可能是unsigned long long

2. sizeof的使用

sizeof用于类型时,格式为 sizeof(类型);

代码语言:javascript
代码运行次数:0
复制
#include<stdio.h>
int main()
{
	printf("%zd\n", sizeof(char));
	printf("%zd\n", sizeof(_Bool));
	printf("%zd\n", sizeof(short));
	printf("%zd\n", sizeof(int));
	printf("%zd\n", sizeof(long));
	printf("%zd\n", sizeof(long long));
	printf("%zd\n", sizeof(float));
	printf("%zd\n", sizeof(double));
	printf("%zd\n", sizeof(long double));
	return 0;
}

在VS2022 X64环境下运行结果为 (具体运行结果与环境不同有所差别)

sizeof用于变量、常量或表达式时,格式为 sizeof(变量名);sizeof 变量名

代码语言:javascript
代码运行次数:0
复制
#include<stdio.h>
int main()
{
	int a = 10;
	printf("%zd\n", sizeof(a));
	printf("%zd\n", sizeof a);//a是变量的名字,可以省略掉sizeof后边的()
	printf("%zd\n", sizeof(int));//但类型不可以省略
	printf("%zd\n", sizeof(3 + 3.5));
	return 0;
}
3. sizeof的使用注意事项

至于为什么说sizeof是在编译时起作用,可以通过下面这个计算表达式的例子来证明

代码语言:javascript
代码运行次数:0
复制
#include <stdio.h>
int main()
{
	short s = 2;
	int b = 10;
	printf("%zd\n", sizeof(s = b + 1));
	printf("s = %d\n", s);
	return 0;
}

sizeof 在代码进行编译的时候,就根据表达式的类型确定了类型的长度,而表达式的执行却要在 程序运行期间才能执行,在编译期间已经将sizeof处理掉了,所以在运⾏期间就不会执行表达式了。

4. sizeof用于数组

sizeof 数组名 得到的结果是整个数组的长度,即数组类型的长度 * 数组的元素个数

如果想要计算数组单个元素的长度,就使用 sizeof 数组名【下标】的方式

同时,再额外引申出来一点,如果想要得到数组元素的个数,只需要将上面两种计算公式结合起来,即 整个数组的长度/单个元素的长度

代码语言:javascript
代码运行次数:0
复制
#include<stdio.h>
int main()
{
	int arr[10] = { 0 };
	printf("%zd\n", sizeof arr);  //结果为40
	printf("%zd\n", sizeof arr[0]);  //结果为4
    printf("%zd\n", sizeof arr/sizeof arr[0]); //结果为10
	return  0;
}

二、strlen()函数

strlen是一个库函数,参数是const char * str,即指针,这是strlen与sizeof的最大区别,它会把所有参数当作指针,同时遇到\0会停止,另外它只能计算字符的长度,不包括\0。 它的返回值也是size_t类型,返回的是\0之前的字符串长度

strlen函数的原型如下

代码语言:javascript
代码运行次数:0
复制
size_t strlen ( const char * str );
代码语言:javascript
代码运行次数:0
复制
#include<stdio.h>
int main()
{
	char arr[] = { "hello world!" };
	printf("%zd\n", strlen(arr)); //计算结果为12
	return 0;
}

三、区别

sizeof和strlen函数的主要区别在于它们计算的内容不同。 sizeof计算类型或对象所占用的字节大小,而strlen计算字符串的长度(不包括结尾的\0字符)。 相比之下,sizeof的功能要强大得多,因为其可以作用与类型 变量 常量 表达式,而strlen只能作用于指针 - sizeof计算的是类型或对象的大小,它是一个编译时运算符,所以在编译时就可以确定大小。 - strlen计算的是字符串的长度,它是一个标准库函数,需要在运行时计算。

下面列举几个sizeof与strlen使用中比较典型的几个例子

示例1
代码语言:javascript
代码运行次数:0
复制
#include<stdio.h>
int main()
{
	char arr[] = { "hello world!" };
	printf("%zd\n", sizeof(arr)); //结果为13
	printf("%zd\n", strlen(arr));  //结果为12
	//这两者的区别在于sizeof会统计\0字符,因为其占了数组元素的一个位置
	return 0;
}

在上面这种情况下,这两者的区别在于

sizeof会统计\0字符,因为其占了数组元素的一个位置

而strlen不会统计\0字符

示例2
代码语言:javascript
代码运行次数:0
复制
#include<stdio.h>
int main()
{
	char arr[20] = { "hello world!" };
	printf("%zd\n", sizeof(arr)); //结果为20
	printf("%zd\n", strlen(arr));  //结果为12
	//sizeof计算是数组的长度,而不是实际使用的长度
	return 0;
}

在上面这种情况下,这两者的区别在于

sizeof计算是数组的长度,而不是实际使用的长度,只要数组申请的是20个元素,那它始终就是20个字节的长度

而strlen这边,只会计算数组中实际有多少字符,与数组大小无关

示例3
代码语言:javascript
代码运行次数:0
复制
#include<stdio.h>
int main()
{
	char arr[] = { 'a','b','c','d'};
	printf("%zd\n", sizeof(arr)); //结果为4
	printf("%zd\n", strlen(arr));  //结果为随机值
	
	return 0;
}

在上面这种情况,当字符数组中没有\0时

sizeof 依然是正常计算字符数组的长度

而strlen的计算结果会变得不可控,因为strlen只有遇到\0才会停下,此时当然是一个随机值

四、总结

sizeof和strlen函数在C语言中都用于计算大小,但它们计算的内容不同。sizeof是一个编译时运算符,用于计算类型或对象所占用的字节大小;strlen是一个标准库函数,用于计算字符串的长度。

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2024-07-22,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 一、 sizeof
    • 1. sizeof简介
    • 2. sizeof的使用
    • 3. sizeof的使用注意事项
    • 4. sizeof用于数组
  • 二、strlen()函数
  • 三、区别
    • 示例1
    • 示例2
    • 示例3
  • 四、总结
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档