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

快速get sizeof和strlen的区别 !

1.sizeof

在学习操作符的时候,学习了sizeof ,是单目操作符,绝对不是函数!!!

sizeof 计算变量所占内存内存空间大小的,单位是字节,如果操作数是类型的话,计算的是使用类型创建的变量所占内存空间的大小。

sizeof 只关注占用内存空间的大小,不在乎内存中存放什么数据。

举个例子:

#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>int main()
{int a = 10;printf("%d\n", sizeof(a));printf("%d\n", sizeof a);printf("%d\n", sizeof(int));return 0;
}

运行结果:

2.strlen

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

size_t strlen ( 1 const char * str );

eg:

#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
#include<stdio.h>int main()
{int len = strlen("abcdef");printf("%zd\n", len);return 0;
}

运行结果:

为什么输出的结果是6呢?

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

#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
#include<stdio.h>int main()
{int len = strlen("abc\0def");printf("%zd\n", len);return 0;
}

本段代码的运行结果就是3:

不同的写法:

//不同的写法
//int main()
//{
//	char str[] = "abcdef";
//	printf("%zd\n", strlen(str));
//	return 0;
//}int main()
{const char* str = "abcdef";printf("%zd\n", strlen(str));return 0;
}

特别注意一种情况:

//特别注意一种情况
int main()
{char arr[] = {'a','b','c'};printf("%zd\n", strlen(arr));return 0;
}

此时不知道什么时候遇到 \0 ,所以产生一个随机值,运行结果:

3.sizeof 和 strlen 的区别,总结一下

sizeof 和 strlen的对比:

sizeof

1. sizeof是操作符。

2. sizeof计算操作数所占内存的大小,单位是字节。

3. 不关注内存中存放什么数据。

4.sizeof 括号中有表达式的话,表达式是不参与计算的!!!

eg:

//表达式不计算
int main()
{int a = 8;short s = 4;printf("%d\n", sizeof(s = a + 100));//short类型printf("%d\n", s);return 0;
}

short 2个字节

int 4个字节

所以在运行是 int 被截断了

运行结果:

那么,为什么不计算呢?

因为C语言是编译型语言

在 test.c 中:

编译—— 连接 —— test.exe —— 运行

strlen

1. strlen是库函数,使用需要包含头文件(#include<string.h>)。

2. srtlen是求字符串长度的,统计的是\0 之前字符的个数。

3. 关注内存中是否有 \0 ,如果没有 \0 ,就会持续往后找,可能会越界。

http://www.xdnf.cn/news/4499.html

相关文章:

  • 做 iOS 调试时,我尝试了 5 款抓包工具
  • ubuntu nobel + qt5.15.2 设置qss语法识别正确
  • 在vue里,使用dayjs格式化时间并实现日期时间的实时更新
  • K8S安装部署(v1.27.6)
  • 【Mybatis-plus常用语法】
  • 《[CISCN 2022 初赛]ez_usb》
  • 6、CMake基础:流程控制
  • Linux 信号(下篇)
  • 元子与元组的关系解析:从简单到复杂大跨界大综合的融智学研究
  • 深入理解 Node.js 模块化(CommonJS):原理、用法与避坑指南
  • 无人机上的热成像相机可以单独使用吗?
  • 康养休闲旅游行程服务实训室:打造沉浸式康养旅游人才培养新模式
  • 【linux常用指令】du命令
  • base64与图片的转换和预览
  • Python Bug 修复案例分析:多线程共享资源引发的数据不一致问题修复
  • SSRF请求伪造
  • -CoderOilStationJava高级工程师
  • 民宿管理系统6
  • 时间序列数据集构建方案Pytorch
  • Vuerouter 的底层实现原理
  • 【机器学习】Logistic 回归
  • 藏文助词标注器入门实践
  • SQLite数据库加密(Java语言、python语言)
  • 第8章-1 查询性能优化-优化数据访问
  • 微信小程序预览文件 兼容性苹果
  • redis bitmap数据类型调研
  • TB6600HG是一款PWM(脉宽调制)斩波型单芯片双极性正弦波微步进电机驱动集成电路。
  • 三款实用工具推荐:配音软件+Windows暂停更新+音视频下载!
  • ZYNQ移植FreeRTOS与OpenAMP双核开发实践指南
  • 《汽车噪声控制》复习重点