C语言中sizeof和strlen的区别详解

 更新时间:2023年06月01日 09:32:26   作者:XXJ不会写代码  
这篇文章主要介绍了C语言中sizeof和strlen的区别,文中有通过代码示例和相关例题给大家介绍的非常详细,需要的朋友可以参考下

一.sizeof和strlen的主要区别

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

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

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

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

二.sizeof和strlen分别讲解(含例题和详解)

1.sizeof

在计算字符型数组时(例题+讲解)

如代码:char  arr1 []="hello bite!"  因为字符串末尾会自动添加\0作为结束标志 所以这个字符串实际是 “hello  bite!\0” 其中一个字符占一个字节,空格和\0也各占一个字节 一共就是12个字节;

代码:

int main()
{
	char arr[] = "hello bite!";
	int ret = sizeof(arr);
	printf("%d\n",ret);
	return 0;
}

运行结果是:

计算整型数组(例题+讲解)

如代码:int arr2 [5]={0};因为是整型,所以一个元素占4个字节(一个整型所占大小);数组大小就是   元素个数×4   即arr2所占大小是5×4=20个字节

代码:

 
int main()
{
	int arr[5] = { 0 };
	int ret=sizeof(arr);
	printf("arr所占内存大小为:%d字节\n",ret);
	return 0;
}

运行结果:

2.strlen

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

例子一(讲解)

char arr[]="abcdefg";   实际字符串内容为 "abcdefg\0" 即strlen所计算的是\0之前的"abcdefg",即算出字符串长度为7个字符;

#include <string.h>
int main()
{
	char arr[] = "abcdefg";
	int len = strlen(arr);
	printf("字符串长度为:%d个字符\n",len);
	return 0;
}

运行结果:

例子二(讲解)

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;
}

运行结果:

三.典型例题

例1

答案解析:

str字符数组使用"hello bit"初始化,最终也会将'\0'放置到数组中,因此数组中总共有10个元素

sizeof(str):获取数组的总大小,10个元素,每个元素占1个字节,因此总共是10个字节

strlen(str): 获取字符串中有效字符的个数,不算'\0',因此总共9个有效字符

故上述printf会分别打印:10  9

因此,选择A

例2

答案解析:

对于int arr[] = {1,2,(3,4),5}数组,里面总共有4个元素,(3,4)为逗号表达式,取后者,因此数组中元素分别为:1,2,4,5

而sizeof(arr)求的是整个数组所占空间的大小,即:4*sizeof(int)=4*4=16

因此,选择B

到此这篇关于C语言中sizeof和strlen的区别详解的文章就介绍到这了,更多相关C语言 sizeof和strlen区别内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • C语言详解数据结构与算法中枚举和模拟及排序

    C语言详解数据结构与算法中枚举和模拟及排序

    枚举和模拟其实是没什么算法可言的,大多数都是按照题目意思去写,这里提供快排和归并的两个模板,感兴趣的朋友来看看吧
    2022-04-04
  • C语言深入探究程序的编译之预处理

    C语言深入探究程序的编译之预处理

    在C语言的程序中包括各种以符号#开头的编译指令,这些指令称为预处理命令。预处理命令属于C语言编译器,而不是C语言的组成部分,通过预处理命令可扩展C语言程序设计的环境
    2022-05-05
  • 举例理解C语言二维数组的指针指向问题

    举例理解C语言二维数组的指针指向问题

    这篇文章主要介绍了C语言二维数组的指针指向问题,文中不建议用二级指针来访问二维数组,需要的朋友可以参考下
    2015-12-12
  • 在C语言中使用对数函数的方法

    在C语言中使用对数函数的方法

    这篇文章主要介绍了在C语言中使用对数函数的方法,包括以e为底和以10为底的对数计算,需要的朋友可以参考下
    2015-08-08
  • 浅析C++中模板的那点事

    浅析C++中模板的那点事

    C++中的模板可分为函数模板和类模板,而把函数模板的具体化称为模板函数,把类模板的具体化成为模板类。下面让我们分别看看什么是函数模板和类模板吧
    2013-09-09
  • C++ 类的赋值运算符''''=''''重载的方法实现

    C++ 类的赋值运算符''''=''''重载的方法实现

    这篇文章主要介绍了C++ 类的赋值运算符'='重载的方法实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-02-02
  • 剖析C++编程中friend关键字所修饰的友元函数和友元类

    剖析C++编程中friend关键字所修饰的友元函数和友元类

    这篇文章主要介绍了剖析C++编程中friend关键字所修饰的友元函数和友元类,友元了以后在外部就可以访问到正常情况下无法访问到的私有属性和方法,需要的朋友可以参考下
    2016-01-01
  • OpenCV实现帧间差分法详解

    OpenCV实现帧间差分法详解

    这篇文章主要为大家详细介绍了OpenCV实现帧间差分法,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2020-03-03
  • Qt模仿实现文字浮动字母的效果

    Qt模仿实现文字浮动字母的效果

    这篇文章主要介绍了通过Qt实现的文字浮动的效果,效果很简单就是文本向上移动,在移动过程中文字整体变大或缩小。感兴趣的可以试一试
    2022-01-01
  • 详解C++中普通旧数据(POD)的使用

    详解C++中普通旧数据(POD)的使用

    普通旧数据就是内存中的连续字节序列,是能够被“仅当作数据”处理的对象。这篇文章主要带大家了解一下C++中普通旧数据的定义与使用,感兴趣的可以了解下
    2023-03-03

最新评论