C语言sizeof与strlen详解

sizeof()详解

1.sizeof()作用:计算变量/类型所占内存大小,单位是字节。(计算字符串函数大小时包含’\0’)
int a = 10;
int b =sizeof(a);    //a为int类型,大小为4个字节
int c = sizeof(int);   //4
2.sizeof是操作符,不是函数 ,所以sizeof的参数可以是数组,指针,类型,对象,函数等。

举个例子:sizeof(类型)可以 sizeof 类型是错误的

int main()
{
	int a, b, c, d;
	a = sizeof(a);
	b = sizeof a;
	c = sizeof(int);
	//d = sizeof int;	//错误
	printf("%d %d %d\n", a, b, c);    // 4 4 4
	return 0;
}
3.sizeof ()内部的表达式不参与真实运算,编译器在编译时就计算出了sizeof的结果。
int main()
{
	int a = 10;
	int b = sizeof(a = a + 1);
	printf("%d %d \n", a, b);    // 10 4
	return 0;
}

:sizeof内部即使写的是赋值表达式也不会去真实的运算,sizeof在计算的时候只看操作数的类型,不会访问对应的空间 。

4.sizeof()与数组名的关系(重难点)

sizeof(数组名):此时的数组名代表的是整个数组

&数组名:此时的数组名代表的也是整个数组

其他情况,数组名代表的是首元素地址(+0,+1…发生偏移引用)

int arr[10];
a = sizeof(arr);    //计算的是整个数组的大小 4*10 = 40
b = sizeof(&arr);   //取出整个数组的地址,是地址(指针),32位:4  64位:8
5.sizeof()容易出错的地方
int i ;	//全局变量未初始化系统默认为0
int main()
{
    i--;	//i变成-1
    if(i > sizeof(i))
    {
        printf(">\n");
    }
    else
    {
        printf("<\n");
    }
    return 0;
}

打印结果: >

:sizeof(i)和i比较时,sizeof返回类型为size_t 而i的类型为int,最终是用size_t比较,对于-1的补码为:全1序列,如果看成是无符号数的话,对于的值比sizeof(i) = 4大。

二.strlen()详解

1.strlen()作用:求字符串长度的库函数,遇到\0即停止计算(不包括\0);
2.需要引用#include<string.h>头文件;
3.注意返回类型为:size_t(unsigned int 无符号整型)。
##include <stdio.h>
#include <string.h>
 
int main(void){
 
    char str [50] = "HelloWorld'\0'Hi";//定义字符数组str容量:50
    int len = strlen(str);//定义整数类型int len,然后把strlen(str)计算出来的长度赋值给len
    printf("len的长度:%d\n",len);
    return 0;
}

HelloWorld’\0’Hi共计13个字符,然而打印出来的结果却只有11个,这是因为strlen()函数在计算长度的时候,碰到’\0’空格键的时候便不再计算后面的长度,计算长度"HelloWorld"+‘共11个,不包括\0’。

三.strlen()与sizeof()的区别

1.共同点:返回类型都是size_t;
2.不同点:sizeof()是操作符计算的是变量/类型所占空间的大小,单位是字节,\0也算进空间;
3.strlen()是库函数,计算的是字符串长度,不计算\0。
int main()
{
	char arr1[] = { 'a','b','c' };
	int ret1 = strlen(arr1);
	int ret2 = sizeof(arr1);
	printf("%d %d\n", ret1,ret2);    //随机值    3
//arr1并没放入\0,strlen()向后直到找到\0才停止,所以是随机值  而arr1本身数组元素个数为3,根据后面初始化的内容确定了数组的大小,sizeof:3*1 = 3
 
	char arr[] = "abcdef";
	int ret3 = strlen(arr);
	int ret4 = sizeof(arr);
	printf("%d %d\n", ret3, ret4);    //6 7
//arr大小为7,含\0  strlen不算\0
	return 0;
}

以上列举了几种strlen()和sizeof()相关的问题,这一方面坑点挺多的,欢迎大家来评论区或私信点赞一起学习,一起进步!

以上为个人总结及网络来源资料查询总结而成,如发现错误,请及时告知删改!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值