【C语言之区分sizeof 和 strlen】

news2025/1/13 14:23:25

C语言之区分sizeof 和 strlen

  • 详解C语言sizeof 和 strlen
    • 1、单目操作符
      • 1.1、详解sizeof单目操作符
      • 1.2、sizeof代码部分
        • 1.2.1、sizeof例程1
        • 1.2.2、sizeof例程2
        • 1.2.3、sizeof例程3
    • 2、详解strlen函数
      • 2.1、strlen代码部分
        • 2.1.1、strlen例程1
    • 3、区别strlen函数和sizeof操作符
        • 3.1、sizeof( )和strlen( )的运用例程1
    • 4.结束语

详解C语言sizeof 和 strlen

前言:
首先,我们需要明白它们的根本区别,sizeof属于关键字也属于单目操作符,而strlen属于库函数

/知识点回顾/

1、单目操作符

单目操作符:单目运算符对应只有一个操作数
常见的单目操作符:

常见的单目操作符描述
逻辑非
’ - ‘
’ + ‘
&取地址
sizeof计算一个数据类型的大小
~取反
减减
++加加
’ * ’解引用
( )强制类型转换

1.1、详解sizeof单目操作符

先大概看一下关于sizeof的技术文档

sizeof expression

The sizeof keyword gives the amount of storage, in bytes, associated,with a variable or a type (including aggregate types).
This keyword,returns a value of type size_t.
The expression is either an identifier or a type-cast expression (a type specifier enclosed in parentheses).
When applied to a structure type or variable, sizeof returns the actual size, which may include padding bytes inserted for alignment.
When applied to a statically dimensioned array, sizeof returns the size of the entire array.
The sizeof operator cannot return the size of dynamically allocated arrays or external arrays.

说明

运算符表达式sizeof关键字给出与变量或类型(包括聚合类型)相关联的存储空间(以字节为单位)
该关键字返回size_t类型的值
表达式要么是标识符,要么是类型强制转换表达式(用圆括号括起来的类型说明符)。
当应用于结构类型或变量时,sizeof返回实际大小,其中可能包括为对齐而插入的填充字节。
当应用于静态维度数组时,sizeof返回整个数组的大小
sizeof操作符不能返回动态分配的数组或外部数组的大小

小结
sizeof的功能是计算一个数据类型的大小,这个类型可以是数组、函数、指针、对象等,单位为字节,它的返回值是size_t类型,也就是unsigned int类型,是一个无符号整数。
注意:sizeof不是一个函数,它是一个运算符,所以它不需要包含任何头文件。

1.2、sizeof代码部分

接下来通过代码例程分解sizeof各个知识点:
1.返回size_t类型的值,sizeof返回实际大小,可能包括为对齐而插入的填充字节
2.当应用于静态维度数组时,sizeof返回整个数组的大小
3.sizeof操作符不能返回动态分配的数组或外部数组的大小

1.2.1、sizeof例程1

说明
返回size_t类型的值(无符号整型),sizeof返回实际大小,可能包括为对齐而插入的填充字节(如:空格)

/*例程1*/
#include <stdio.h>
int main()
{
	printf("size_t1 = %d\n", sizeof(int));//sizeof参数可以是类型,这里返回的就是int型字节大小
	int a = 10;
	printf("size_t2 = %d\n", sizeof(a));//计算a所占用的空间大小,单位是字节,且a为整型变量
	char b = 'B';
	printf("size_t3 = %d\n",sizeof(b));//计算a所占用的空间大小,单位是字节,且b为字符型变量
	char arr1[] = "hello";
	printf("%d\n",sizeof(arr1));
	//计算包括为对齐而插入的填充字节(如:空格)
	char arr2[] = "h e l l o";
	printf("%d\n", sizeof(arr2));
	return 0;
}

如图所示

在这里插入图片描述

1.2.2、sizeof例程2

说明
当应用于静态维度数组时,sizeof返回整个数组的大小

/*例程2*/
#include <stdio.h>
int main()
{
	char arr[10] = { 0 };
	//计算arr数组元素所占用的空间大小,单位是字节
	printf("%d\n", sizeof(arr[1]));//1

	printf("%d\n", sizeof(arr));//10---char数组字节1---10个就是1*10 = 10
	//同理:int类型那么就是10*4 = 40
	return 0;
}

如图所示
在这里插入图片描述

1.2.3、sizeof例程3

说明
sizeof操作符不能返回动态分配的数组或外部数组的大小(特别易错)

/*例程3*/
#include <stdio.h>
int main()
{
	short a = 5;
	int b = 10;
	printf("%d\n", sizeof(a = b + 2));//输出2 ---- 单位字节,仍为short类型
	//注意:小的空间内存放不进比它大的数据,会数据截断,仍为short类型,a+2也不会运算
	//且sizeof(参数),参数的计算不对参数外起作用
	printf("%d\n", a);//输出5 ---- a+2也不会运算

	int arr1[] = { 1,2,3,4 };
	int arr2[] = { 1, 2, (3, 4), 5 };
	//注意:这里的(3,4)是逗号运算符,计算结果作为数组的元素,数组类型相同元素个数相同,所以字节空间大小相同
	printf("%d\n", sizeof(arr1));//16
	printf("%d\n", sizeof(arr2));//16
	return 0;
}

如图所示
在这里插入图片描述

2、详解strlen函数

老规矩先看一下关于strlen函数的技术文档:
在这里插入图片描述
说明

Return Value

Each of these functions returns the number of characters in string,
excluding the terminal NULL. No return value is reserved to indicate an error.
原型:size_t strlen( const char *string );

小结
1.返回类型仍然是size_t类型,参数为字符串类型,const是修饰为不可改变的变量
2.strlen的功能是计算一个指定字符串的长度,函数原型是size_t strlen(const char *s),它的返回值是size_t类型,也就是unsigned int类型,返回的是字符串的长度
3.需要包含头文件#inlude <string.h>,参数s是字符串首地址

注意:strlen的结果要在运行的时候才能计算出来,是用来计算字符串的长度,不是类型占内存的大小,不包括’\0’。strlen是不会计算’\0’之后的长度的。

2.1、strlen代码部分

接下来通过代码例程了解strlen知识点:
1.返回size_t类型的值,strlen返回字符串长度

2.1.1、strlen例程1

说明
返回size_t类型的值,strlen返回字符串长度

/*例程1*/
#include <stdio.h>
#include <string.h>
//使用strlen函数,需要调用头文件 ---- <string.h>
int main()
{
	char arr[] = "hello";
	printf("%d\n",strlen(arr));//计算字符串长度,不包括'\0'
	return 0;
}

如图所示
在这里插入图片描述

3、区别strlen函数和sizeof操作符

小结
a、sizeof会将空字符\0计算在内,而strlen不会将空字符\0计算在内。
b、sizeof是操作符(关键字),它结果类型是size_t,它在头文件中typedef为unsigned_int类型,而strlen是函数。
c、sizeof可以用类型做参数,strlen只能用char*做参数,且必须是以’‘\0’'结尾的。

3.1、sizeof( )和strlen( )的运用例程1

/*例程1*/
#include <stdio.h>
#include <string.h>
int main()
{
	char str[] = "hello bit";
	//hello bit\0
	printf("%d %d\n", sizeof(str), strlen(str));//10 9
	//strlen()函数求字符串长度
	//sizeof关键字计算变量/类型所占用的内存大小,单位字节
	return 0;
}

4.结束语

相信看到这里大家对于strlen是什么?和sizeof是什么?有了更加深入的理解了,如果对你有所帮助,不要客气一件三连哦让更多人阅读,谢谢您勒!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/693705.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

数据库—属性闭包

属性闭包 要理解属性闭包先理解以下概念 U属性集合&#xff0c;比如一个表A有这些属性**{a,b,c,d,e}**F函数依赖集 这个就是由已知的一些函数依赖组成的集合&#xff0c;比如&#xff1a; F {a->b,b->c,c->d,ab->e} //F函数依赖集R(U&#xff0c;F)表示一个关系模…

linux工程管理工具make

linux工程管理工具make 一、make 工具的功能二、makefile 文件三、makefile 的规则Makefile 介绍一、Makefile 的规则二、一个示例三、其他例子makefiletest.cprocess.cprocess.h截图 一、make 工具的功能 1、主要负责一个软件工程中多个源代码的自动编译工作 2、还能进行环境…

Spring boot装载模板代码工程实践问题之二

Spring boot装载模板代码工程实践问题解决方案 替代方案解决方案及解释 Spring boot装载模板代码工程中&#xff0c;后续有自定注解的要求&#xff0c;在本地运行无恙&#xff0c;打成jar启动后&#xff0c;自定义注解会无效。 替代方案 在测试compiler.getTask多种参数后&…

7.MMM

文章目录 MMM概念配置mysql配置文件主主复制主从服务器配置--只需要配置一个主服务器的安装mysql-MMM 测试故障测试客户端测试 MMM 概念 MMM&#xff08;Master-Master replication manager for MvSQL&#xff0c;MySQL主主复制管理器&#xff09; 是一套支持双主故障切换和双…

git merge和git rebase的区别

本文来说下git merge和git rebase的区别 文章目录 分支合并解决冲突git rebase和git merge的区别本文小结 分支合并 git merge是用来合并两个分支的。比如&#xff1a;将 b 分支合并到当前分支。同样git rebase b&#xff0c;也是把 b 分支合并到当前分支。他们的 「原理」如下…

并发-操作系统底层工作的整体认识

冯诺依曼计算机模型 五大模块&#xff1a;输入、输出、计算器【cpu】、存储器【内存】、控制器 现在计算机硬件结构设计 CPU&#xff1a;控制、运算、数据

工业机器人运动学与Matlab正逆解算法学习笔记(用心总结一文全会)(三)

文章目录 机器人逆运动学△ 代数解求 θ 4 \theta_4 θ4​、 θ 5 \theta_5 θ5​、 θ 6 \theta_6 θ6​○ 求解 θ 4 \theta_4 θ4​○ 求解 θ 5 \theta_5 θ5​○ 求解 θ 6 \theta_6 θ6​ CSDN提示我字数太多&#xff0c;一篇发不下&#xff0c;只好拆分开x2。。。 关于…

shiro-all由1.3.2 升级到1.11.0后出现重定向次数过多的问题:ERR_TOO_MANY_REDIRECTS

最近漏洞升级, shiro-all由1.3.2 升级到1.11.0后, 导致系统登录首页打不开, 一直提示重定向次数过多: ERR_TOO_MANY_REDIRECTS: 经定位: 是shiroFilter配置中: loginUrl配置问题 以一下例子具体说明参数含义&#xff1a; 1&#xff0c;假设网站的网址是http://localhost…

基于STM32F407的智慧农业系统

文章目录 一、设备平台二、功能说明三、硬件系统设计实现与图表四、软件系统设计实现与流程图五、调试过程中出现的问题及相应解决办法六、程序设计1. 开始任务函数2. LED任务函数3. KEY任务函数4. UART任务函数5. OLED任务函数6. DHT11任务函数7. BEEP任务函数8. ADC任务函数9…

写一个简单的静态html页面demo,包含幻灯片

效果图&#xff1a; 代码如下&#xff0c;图片文件可自行更换&#xff1a; <!DOCTYPE html> <html> <head><title>公司网站</title><style>/* 样式定义 */body {font-family: Arial, sans-serif;margin: 0;padding: 0;}header {backgrou…

什么是Session

1、web中什么是会话 &#xff1f; 用户开一个浏览器&#xff0c;点击多个超链接&#xff0c;访问服务器多个web资源&#xff0c;然后关闭浏览器&#xff0c;整个过程称之为一个会话。 2、什么是Session &#xff1f; Session:在计算机中&#xff0c;尤其是在网络应用中&…

Linux学习之进程概念和ps命令

进程概念和启动关闭进程 进程就是运行中的程序 在C语言中进程只能只能从main()函数开始运行。 进程终止的方式有两种&#xff1a; 正常终止&#xff1a;从main()函数返回、调用exit()等方式 异常终止&#xff1a;调用abort、接收信号等。有可能 ps ps是“process status”的缩…

华为OD机试真题 Python 实现【光伏场地建设规划】【2023Q1 100分】

一、题目描述 祖国西北部有一片大片荒地&#xff0c;其中零星的分布着一些湖泊&#xff0c;保护区&#xff0c;矿区&#xff1b;整体上常年光照良好&#xff0c;但是也有一些地区光照不太好。某电力公司希望在这里建设多个光伏电站&#xff0c;生产清洁能源。对每平方公里的土…

React入门(B站李立超老师)

视频地址&#xff1a;https://www.bilibili.com/video/BV1bS4y1b7NV/ 课程第一部分代码&#xff1a; https://pan.baidu.com/s/16hEN7j4hLDpd7NoFiS8dHw?pwd4gxv 提取码: 4gxv 课程第二部分代码&#xff1a;https://pan.baidu.com/s/1mDkvLqYVz1QGTV1foz5mQg?pwd5zir 提取码&…

NCV2903DR2G 低偏移电压比较器

NCV2903DR2G安森美深力科是一款双独立精密电压比较器&#xff0c;能够进行单电源或分电源操作。这些设备被设计为允许在单电源操作的情况下实现共模范围到地电平。低至2.0 mV的输入偏移电压规格使该设备成为消费类汽车和工业电子中许多应用的绝佳选择。 特性&#xff1a; 1.宽…

从密码学了解如何确定物联网信息安全

一.物联网安全概述 1.信息安全的主要内容 2.密码学 编码学和分析学的关系&#xff1a;相互对立、相互依存、相互促进 3.密码学历史 1.第一阶段&#xff1a;几千年前到1949年&#xff0c;此时还没有形成一门科学&#xff0c;靠密码分析者的直觉和经验来进行 代表&#xff1a;C…

DAY35——贪心part4

1. class Solution {public boolean lemonadeChange(int[] bills) {int five 0;int ten 0;for (int i 0; i < bills.length; i) {if (bills[i] 5) {five;} else if (bills[i] 10) {five--;ten;} else if (bills[i] 20) {if (ten > 0) { //贪心 优先使用面值为10的…

8.2 PowerBI系列之DAX函数专题-进阶-实现切片器筛选之间的or逻辑

需求 两个切片器之间都被选中的情况下&#xff0c;实现符合切片器条件的并集的结果呈现&#xff0c;而非交集的结果呈现&#xff0c; 实现 or #1 var occupations values(customer[occupation]) --获取到当前切片器选中的值 var bands values(product[brand]) return s…

Node环境中调用Python脚本

今天遇到一个需要在Node服务中调用Python脚本的需求&#xff0c;这里就把这个场景单独抽离出来汇总一下方法 在node中的child_process中有execSync, exec两个方法来创建一个子进程&#xff0c;然后在子进程里执行对应的python命令&#xff0c;这两个命令可以让我们执行一个脚本…

蓝桥杯专题-试题版-【完美的代价】【芯片测试】【序列求和】【杨辉三角形】

点击跳转专栏>Unity3D特效百例点击跳转专栏>案例项目实战源码点击跳转专栏>游戏脚本-辅助自动化点击跳转专栏>Android控件全解手册点击跳转专栏>Scratch编程案例点击跳转>软考全系列点击跳转>蓝桥系列 &#x1f449;关于作者 专注于Android/Unity和各种游…