【C语言】sizeof和strlen的区别


需要云服务器等云产品来学习Linux的同学可以移步/-->腾讯云<--/-->阿里云<--/-->华为云<--/官网,轻量型云服务器低至112元/年,新用户首次下单享超低折扣。


目录

一、size和strlen的异同

二、数组名意义的两个特例

三、结合实例分清sizeof和strlen

1、一维数组

易错解析

2、字符数组

易错解析

3、二维数组

易错解析


一、size和strlen的异同

sizeof和strlen的返回类型都是unsigned int类型。

sizeof是关键字,sizeof(X)统计的是X的大小,单位是字节。例如X是数组,则统计数组的大小(字符数组包含'\0');若X是内置类型,则计算内置类型的大小;若X是指针变量,则计算指针变量的大小,等等。

strlen是库函数,参数是一个指针,用于求字符串长度,遇到'\0'就停止,不计算'\0'。

二、数组名意义的两个特例

1、sizeof(数组名)计算的是整个数组在内存中的大小;

2、&数组名表示取出的是整个数组的地址。

除去上述两种情况,其他时候数组名均表示数组首元素的地址。

三、结合实例分清sizeof和strlen

1、一维数组

#include <stdio.h>
#include <string.h>
int main()
{
	int a[] = { 1,2,3,4 };
	printf("一%zu\n", sizeof(a));//16
	printf("二%zu\n", sizeof(a + 0));//4/8
	printf("三%zu\n", sizeof(*a));//4
	printf("四%zu\n", sizeof(a + 1));//4/8
	printf("五%zu\n", sizeof(a[1]));//4
	printf("六%zu\n", sizeof(&a));//4/8
	printf("七%zu\n", sizeof(*&a));//16
	printf("八%zu\n", sizeof(&a + 1));//4/8
	printf("九%zu\n", sizeof(&a[0]));//4/8
	printf("十%zu\n", sizeof(&a[0] + 1));//4/8
	return 0;
}

易错解析

第二句:sizeof里面是a+0,不是数组名,不满足两个特例,所以这里的a代表数组首元素的地址,a+0仍表示数组首元素的地址,所以这里是4/8个字节。

第六句:&a(取出a的地址),所以sizeof里面是整个数组的地址。

第七句:*&可抵消。

2、字符数组

#include <stdio.h>
#include <string.h>
int main()
{
	char arr[] = { 'a','b','c','d','e','f' };
	printf("一%zu\n", sizeof(arr));//6
	printf("二%zu\n", strlen(arr));//随机值
    printf("三%zu\n", strlen(*arr));//err
    
    char* p = "abcdef";
	printf("四%zu\n", sizeof(p));//4/8
	return 0;
}

易错解析

第一句:sizeof只统计arr的大小,和arr内部存放的内容没有关系,所以是6个字节;

第二句:strlen是要找到'\0'为止,该数组内不存在'\0',所以结果是不可知的;

第三句:strlen的参数必须是一个指针,*arr是a,a的ASCII值是97,使用strlen访问97地址是不允许的,这里编译器会挂掉;

第四句:p是个指针,所以是4/8个字节。

3、二维数组

#include <stdio.h>
#include <string.h>
int main()
{
	int a[3][4] = { 0 };
	printf("一%zu\n", sizeof(a));//48
	printf("二%zu\n", sizeof(a[0][0]));//4
	printf("三%zu\n", sizeof(a[0]));//16
	printf("四%zu\n", sizeof(a[0] + 1));//4/8
	printf("五%zu\n", sizeof(*(a[0] + 1)));//4,单个元素的大小
	printf("六%zu\n", sizeof(a + 1));//4/8
	printf("七%zu\n", sizeof(*(a + 1)));//16
	printf("八%zu\n", sizeof(*(a + 1)+1));//4/8
	printf("九%zu\n", sizeof(&a[0] + 1));//4/8
	printf("十%zu\n", sizeof(*(&a[0] + 1)));//16
	printf("十一%zu\n", sizeof(*a));//16
	printf("十二%zu\n", sizeof(a[3]));//16
	return 0;
}

易错解析

第三句:sizeof(a[0])中的a[0]表示二维数组第一行的数组名,所以这里占16个字节。

第四句:sizeof中a[0]+1不满足两个特例,所以这里的a[0]是第一行第一个元素的地址,a[0]+1即为第一行第二个元素的地址。所以占4/8个字节。

第七句:等价于sizeof(a[1]),a+1是第二行的地址,*(a+1)是指向第二行首元素的地址,因为在sizeof内部,计算的是整个数组的大小。

第八句:第七句的基础上+1,不满足两个特例,表示第二行第二个元素的地址,所以是4/8

第九句:&a[0] + 1表示第二行的地址

第十句:第二行的地址解引用得到整个第二行,计算的是第二行的大小。

评论 31
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

蒋灵瑜

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值