C语言 sizeof和strlen的区别

38 篇文章 10 订阅
11 篇文章 0 订阅


Chapter1 C语言 sizeof和strlen的区别

原文链接:https://blog.csdn.net/qq_52368521/article/details/124950895

主要区别如下:
1、sizeof是运算符,strlen是C语言标准库函数。
2、 strlen 测量的是字符串的实际长度,以’\0’ 结束,返回结果不包括’\0’ 。
3、而sizeof 测量的是字符的分配大小,它的参数可以是数组、指针、类型、对象、函数等。
具体而言,当参数分别如下时,sizeof返回的值含义如下:

数组-编译时分配的数组空间大小;

指针-存储该指针所用的空间大小;

类型-该类型所占的空间的大小;

对象-对象的实际占用空间大小;

函数-函数返回类型所占空间的大小;

例题1:

char *str1=“absde”;
char str2[]=“absde”;
char str3[8]={‘a’,};
int str4[8]={‘a’,};
char ss[] =0123456789;

输出:

sizeof(str1); // 4,计算的是指针内存的大小,包括’\0’
sizeof(str2); // 6 ,计算的是字符串的内存大小,包括’\0’
sizeof(str3); // 8 ,计算的是char型数组的内存大小
sizeof(str4); // 32 ,计算的是int型数组的内存大小
sizeof(ss); // 11 ,计算的是字符串的大小,包括’\0’
strlen(str1); // 5 ,计算的是字符串长度,不包括‘\0’
strlen(str2); // 5 ,计算的是字符串长度,不包括‘\0’
strlen(str3); // ? ,因为字符串需要找到’\0’才可结束,要在’a’之后找到’\0’,所以是个随机值
strlen(str4); // ? ,因为字符串需要找到’\0’才可结束,要在’a’之后找到’\0’,所以是个随机值
strlen(ss); // 10 ,计算的是字符串长度,不包括‘\0

例题2:

what is the output of this code?
char s[20]=“Hello\0Hi”;
printf(%d %d”,strlen(s),sizeof(s));
A 5 9
B 7 20
C 5 20
D 8 20

正确答案 C

例题3

char str[]=“hello”;
char *p=str;
int n=10;
//请计算
sizeof(str); //6,5+1=6,1代表’\0’
sizeof(p); //4,代表指针
sizeof(n); //4,整形占据的存储空间

void func(char str[100])
{
sizeof(str); //4,此时str已经转换为指针了
}

Chapter2 sizeof和strlen的区别【详解】

原文链接:https://blog.csdn.net/2301_77509762/article/details/130961120

一.sizeof和strlen的主要区别
1.sizeof 是运算符,而strlen 是C语言库函数中的一个函数(使用时包含头文件(string.h));

对于sizeof来说,使用时不加()也是正确的,这样也可以说明sizeof不是函数

2.sizeof 操作符用于计算变量或类型的大小,一般单位为字节,通常用于计算内存大小。

3.strlen是计算字符串长度的,遇到\0结束,返回不包括\0,即如果没有\0则会计算出随机值;

sizeof
在计算字符型数组时(例题+讲解)
如代码:char arr1 []=“hello bite!” 因为字符串末尾会自动添加\0作为结束标志 所以这个字符串实际是 “hello bite!\0” 其中一个字符占一个字节,空格和\0也各占一个字节 一共就是12个字节;

strlen
strlen是计算字符串长度的,遇到\0结束,返回不包括\0,即如果没有\0则会计算出随机值;

例子一(讲解):
char arr[]=“abcdefg”; 实际字符串内容为 “abcdefg\0” 即strlen所计算的是\0之前的"abcdefg",即算出字符串长度为7个字符;

char arr[]={ ‘a’ , ‘b’ , ‘c’, ‘d’ , ‘e’ , ‘f’ , ‘g’ }; 该字符数组中放入的是 a b c d e f g 这7个字符;因为不是字符串,所以末尾没有\0;没有\0,当使用strlen函数进行计算是就不知道在哪里结束;计算结果就是我们想不到的随机值(如下面的运行结果14028835)意思是当使用strlen函数进行计算时,当计算完arr数组时,因为没遇到\0,所以还要继续往后计算,(这里直到计算了14028835个字符后)才遇到\0结束;

#include <string.h>
 
int main()
{
	char arr[] = { 'a','b','c','d','e','f','g' };
	int len = strlen(arr);
	printf("arr的长度为:%d字符\n");
 
 
	return 0;
}

Chapter3 关于 strlen 与 sizeof 的区别

原文链接:https://blog.csdn.net/zhengqijun_/article/details/51815081

#include <stdio.h>
#include <string.h>
 
int main()
{
    char str1[] = "hello";
    char str2[] = {'h', 'e', 'l', 'l', 'o', '\0'};
    char str3[] = {'h', 'e', 'l', 'l', 'o'};
    
    printf("str1:%s\n",str1);
    printf("str2:%s\n",str2);
    printf("str3:%s\n",str3);
    printf("str1:%d\n", strlen(str1));
    printf("str2:%d\n", strlen(str2));
    printf("str3:%d\n", strlen(str3));
 
    return 0;
}                 

结果显示为:

str1:hello
str2:hello
str3:hellohello
str1:5
str2:5
str3:10

这是为什么呢?

我们知道字符串是以 ‘\0’ 为结束标志的,所以char str1[ ] = “hello” 等效于char str2[ ] = {‘h’ , ‘e’ , ‘l’ , ‘l’ , ‘o’ , ‘\0’} 。strlen函数求的是字符串的实际长度,它求得方法是从开始到遇到第一个’\0’,如果你只定义没有给它赋初值,这个结果是不定的,它会从首地址一直找下去,直到遇到’\0’停止。而如果不在字符数组初始化的时候加上\0,那么strlen 得到的值就不是正确的数值,打印出来的结果也不是想要的结果。因此我们要避免这种情况,在初始化的时候要记得加上 \0,或者一次性赋初值。

strlen的结果要在运行的时候才能计算出来,是用来计算字符串的长度,不是类型占内存的大小。而大部分编译程序在编译的时候就把sizeof计算过了是类型或是变量的长度。

sizeof可以用类型做参数,strlen只能用char*做参数,且必须是以’‘\0’'结尾的。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值