当前位置: 首页 > article >正文

sizeof与strlen()函数的对比总结

目录

    • 1.sizeof操作符
      • 1.1sizeof操作符特点
    • 2.strlen( )函数
      • 2.1 函数简介
      • 2.2 创建字符串
    • 3.sizeof 和 strlen的对比


1.sizeof操作符

在学习操作符的时候,我们学习了 sizeof , sizeof 计算变量所占内存内存空间⼤⼩的,单位是字节,如果操作数是类型的话,计算的是使⽤类型创建的变量所占内存空间的⼤⼩。

  • sizeof 只关注占⽤内存空间的⼤⼩,不在乎内存中存放什么数据。
  • sizeof是操作符,不是函数,函数数的调用需要括号,二sizeof的调用不需要。
int main()
{
 int a = 10;
 printf("%zd\n", sizeof(a));
 printf("%zd\n", sizeof a);
 printf("%zd\n", sizeof(int));
 
 return 0;
}

运行结果:
在这里插入图片描述

1.1sizeof操作符特点

刚刚我们就已经讲到:

sizeof 只关注占⽤内存空间的⼤⼩,不在乎内存中存放什么数据。其实sizeof操作符还不会对操作对象进行计算:

int main()
{
	int a = 8;
	short s = 4;
	printf("%zd\n", sizeof(s = a + 2));
	printf("%zd\n", s);
	return 0;
}

所以按照我们分析,这个程序打印出来应该是short类型的字节长度,而且不会计算a+2;我们来看看结果是否如此:
在这里插入图片描述
为什么呢:
这里我们简单讲一下:

我们知道C语言是编译型语言,一个程序需要经过:编译-- >链接–>test.exe -->运行;
而表达式是在运行的时候才开始计算,但 sizeof 主要是静态编译阶段的一部分,它在编译时期就能确定数据对象的存储大小,不需要运行时的信息;所以sizeof不会计算表达式

2.strlen( )函数

2.1 函数简介

strlen 是C语⾔库函数,功能是求字符串⻓度。函数原型如下:

size_t strlen ( const char * str );

统计的是从 strlen 函数的参数 str 中这个地址开始向后, \0 之前字符串中字符的个数。strlen 函数会⼀直向后找 \0 字符,直到找到为⽌,所以可能存在越界查找。

int main()
{
	const char* str1 = "abcd\0ef";
	const char* str2 = "abcdaef";
	printf("%zd\n", strlen(str1));
	printf("%zd\n", strlen(str2));
	return 0;
}

我们可以预测一下结果:
在这里插入图片描述

2.2 创建字符串

创建字符串的场景有很多:

int main()
{
	char arr[] = "abcdef";   //a b c d e f \0
	const char* str = "abcdef";  //a b c d e f \0
	return 0;
}

这两种创建方法都可以用strlen函数得出其字符串长度;因为在创建的时候默认在末尾加了‘\0’
在这里插入图片描述

但有一种方法要注意:

	char arr1[] = { 'a', 'b', 'c' };

这种创建方法并不会在末尾加‘\0’,所以用strlen函数求长度就充满了不确定性:
在这里插入图片描述

#include <string.h>
int main()
{
	char arr[] = "abcdef";   //a b c d e f \0
	const char* str = "abcdef";  //a b c d e f \0
	char arr1[] = { 'a', 'b', 'c' };
	printf("%zd ", strlen(arr));
	printf("%zd ", strlen(str));
	printf("%zd ", strlen(arr1));
	return 0;
}

在这里插入图片描述

3.sizeof 和 strlen的对比

sizeofstrlen
1. sizeof是操作符1. strlen是库函数,使⽤需要包含头⽂件 string.h
2. sizeof计算操作数所占内存的⼤⼩,单位是字节2. srtlen是求字符串⻓度的,统计的是 \0 之前字符的隔个数
3. 不关注内存中存放什么数据3. 关注内存中是否有 \0 ,如果没有 \0 ,就会持续往后找,可能会越界


http://www.kler.cn/a/314506.html

相关文章:

  • 低代码集成多方API的简单实现
  • 大数据 ETL + Flume 数据清洗 — 详细教程及实例(附常见问题及解决方案)
  • 单例模式详解:如何优雅地实现线程安全的单例
  • Typescript类型运算符、关键字以及内置高级类型
  • go reflect 反射
  • Docker无缝更新Zentao
  • 【数据结构与算法 | 每日一题 | 力扣篇】力扣1184
  • 网络安全详解
  • vue 2表格滚动加载
  • 电子竞技信息交流平台|基于java的电子竞技信息交流平台系统小程序(源码+数据库+文档)
  • 输电线路绝缘子红外检测数据集
  • 使用python-pptx将PPT转换为图片:将每张幻灯片保存为单独的图片文件
  • Android命令行启动settings
  • 基于Spring Boot的Java免税商品优选商城设计
  • 如何有效检测住宅IP真伪?
  • dbt compile 命令及应用
  • docker基本(仅供自己参考)
  • RK3568笔记六十:V4L2命令测试
  • 【数据可视化】Arcgis api4.x 热力图、时间动态热力图、timeSlider时间滑块控件应用 (超详细、附免费教学数据、收藏!)
  • Linux系统下rar压缩包怎么解压
  • 我的AI工具箱Tauri版-VideoClipMixingCut视频批量混剪
  • FreeRTOS的递归互斥锁
  • [SDX35+WCN6856]SDX35 + WCN6856 默认增加打包wifi配置hostapd_24g.conf和hostapd_5g.conf操作方法
  • hive分区详细教程
  • 标准c语言(一)
  • 图像处理与OCR识别的实践经验(2)