sizeof,sizeof与strlen的区别

深刻了解C语言中的sizeof()和strlen() sizeof和strlen在C语言中的区别 阅读详情

目录

一.sizeof介绍

1.1sizeof中表达式不计算

1.2sizeof计算数组大小

1.3sizeof计算数组元素个数

二.strlen

三. sizeof与strlen的区别


一.sizeof介绍

        sizeof是一个关键词也是操作符,专门用来计算类型或者变量大小,其实sizeof也可以计算数组的大小,单位都是字节。sizeof是一个非常有用的工具:

  1.  确定数据结构的大小。

  2. 分配内存。

  3. 比较不同数据类型或变量的大小。

  4. 避免缓冲区溢出。 

        sizeof操作符的操作数可以是类型,也可以是变量或者表达式。

sizeof(类型)

sizeof 表达式

  • sizeof的操作数如果不是类型,是表达式的时候,可以省略掉后边的括号。

  • sizeof后边的表达式是不真实参与运算的,根据表达式的类型来得出大小。
  • sizeof的计算结果是size_t类型的。

( size_t:

sizeof运算符的返回值,C语言只规定是无符号整数,并没有规定具体的类型,而是留给系统自己去决定,sizeof到底返回什么类型。不同的系统中,,返回值的类型有可能是unsigned int,也有可能是unsigned int,甚至是unsigned long long,对应的printf()占位符是%u ,%lu,%llu 。这吧利于程序的可移植性。

C语言提供了一个解决方法,创造了一个类型别名size_t,用来统一表示sizeof的返回值类型。对应当前系统的sizeof的返回值类型,可能是unsigned int,也可能是unsigned long long。)

比如:

#include<stdio.h>
int main()
{
	int a=10;
	printf("%zd\n", sizeof(a));
	printf("%zd\n", sizeof a);//a是变量的名字,可以省略掉sizeof后边的()
	printf("%zd\n", sizeof(int));
	printf("%zd\n", sizeof (3 + 3.5));
	return 0;
}

 运算结果:


        当我们占位符使用%d时,编译器会报错,但程序能运行 

如: 

#include<stdio.h>
int main()
{
	int arr[10] = { 0 };
	printf("%d\n", sizeof(arr));
	return 0;
}//返回40

 

1.1sizeof中表达式不计算

        在sizeof运算符中,表达式不会被计算,因为sizeof运算符返回的是数据类型的字节数,而不是表达式的值。表达式仅用于确定数据类型。

#include<stdio.h>
int main()
{
	short i = 2;//字节为2
	int j = 10;
	printf("%zd\n", sizeof(i = j + 1));
	printf("i=%d\n", i);
	return 0;
}

运行结果:

这是因为sizeof运算符返回的是short类型的字节数,而不是i=j + 1表达式的值。

1.2sizeof计算数组大小

        数组大小=有效元素个数(包括\0和空白字符)*每个元素的字节

#include<stdio.h>
int main()
{
	char arr[] = "abc  def";
	printf("%d\n", sizeof(arr));
	return 0;
}//输出9

        由于字符串末尾自动放置‘\0’,中间有三个空格,因此该数组有9个元素。9*1=9

练习:下面代码的结果是:

#include <stdio.h>
int main()
{
    int arr[] = {1,2,(3,4),5};
    printf("%d\n", sizeof(arr));
    return 0;
}

 答案:16          因为该数组是一维数组,(3,4)为逗号表达式,表达式从左向右计算,值为最后一个表达式的值,arr[2]=4(数组:https://blog.youkuaiyun.com/wait___wait/article/details/135208488)

1.3sizeof计算数组元素个数

#include<stdio.h>
int main()
{
	int arr[10] = { 0 };
	int sz = sizeof(arr) / sizeof(arr[0]);//数组大小/每个元素的字节
	printf("%d\n", sz);
	return 0;
}//打印10

二.strlen

        strlen 是一个 C 语言库函数,它返回一个字符串的长度(不包括\0)。头文件为string.h。

size_t strlen(const char *str) 

  •  str  是要计算长度的字符串。

  • size_t是一个无符号整数类型,用于表示字符串的长度。

  • strlen 函数的返回值是字符串的长度,不包括字符串结尾的空字符('\0')。

三. sizeof与strlen的区别

  1.     求数组元素下标    
    //求数组元素下标
    char arr[]="abcdef";
    int right1=strlen(arr)-1;//由于数组下标从0开始,所以求得的字符串长度要减1
    int right2=sizeof(arr)/sizeof(arr[0])-2;//sizeof计算'\0'的长度,所以要减2
  2. 求数组大小

    char arr1[]="abcdefg";//末尾有\0
    char arr2[]={'a', 'b','c','d','e','f','g'};//末尾没有\0
    printf("%zd\n", sizeof(arr1));
    printf("%zd\n", sizeof(arr2));
    printf("%d\n", strlen(arr1));
    printf("%d\n", strlen(arr2));//随机值

 运行结果:

        由于 strlen从首元素开始计算,遇到‘\0’停止,若无‘\0’,则结果是随机值。

练习:下面代码的结果是:

#include <stdio.h>
int main()
{
    char str[] = "hello bit";
    printf("%d %d\n", sizeof(str), strlen(str));
	  return 0;
}

答案:10 9 

期待

strlen和sizeof的区别 sizeof是一个运算符,其值在编译期间就已经计算好了,其参数可以是数组、类型、对象、函数等。功能计算该参数建立的对象的最大字节由于在编译期间就发生了计算,因此sizeof只能计算非动态的对象,sizeof的返回值和传入参数的内容无关,并且其返回值是size_t类型,也就是unsignedint类型。strlen是一个函数,其值是在运行时候被计算,strlen的参数必须是char*类型功能计算遇见'\0'之前的所有字符个数。... 阅读详情

相关推荐

基于Python的高考志愿辅助填报系统

在实际应用中,系统需要处理更复杂的数据,包括更多的高校和专业信息、更详细的录取规则、以及用户的历史选择等。系统需要提供用户友好的界面,让考生输入自己的信息和偏好,然后通过后端的模型计算出推荐的志愿列表。此外,系统还应该提供一些个性化的服务,如根据考生的输入动态调整推荐策略、保存用户的填报历史和偏好等。特征可能包括考生的分数、所在省份、文理科类别、专业偏好、高校的地理位置、排名、专业的就业前景等。3. **推荐逻辑**:根据用户的分数和专业偏好,结合历史录取数据,使用简单的算法来推荐可能录取的高校和专业。

coder_wwwdy的博客 1976

sizeof运算符

一. sizeof 的概念 sizeof 是一种单目运算符,sizeof 以字节形式给出其操作数的存储大小。操作数可以是一个表达式或类型名,操作数的存储大小由操作数的类型决定。 二. sizeof 的用法 1.用于数据类型 使用形式:sizeof(type) 数据类型必须使用括号括住 2.用于变量 使用形式:sizeof(变量名) 或 sizeof + 变量名,变量名可以不用括号括住 sizeof 操作符不能用于函数类型,不完全类型或位字段,不完全类型指具有未知存储大小的数据类型

lllllllll231的博客 2万+

高精度SAR ADC设计实战:从建模到版图的16位1MSPS实现

本文详细介绍了16位1MSPS高精度SAR ADC的设计过程,从建模到版图实现的完整流程。重点探讨了分段电容阵列设计、校准算法实现及版图匹配等关键技术,展示了如何在180nm工艺下实现92.5dB SNDR和109.6dB SFDR的高性能指标。文章特别强调了整数桥接电容设计对提升匹配精度的关键作用,为高精度模数转换器设计提供了实用参考。

weixin_33724046的博客 436

全网最详细的sizeof运算和strlen函数讲解(通过多种数据类型举例)

本博客详细介绍了sizeof对基本数据类型、数值型数组、字符数组、字符串的计算,同时也包含了strlen对字符数组和字符串的计算,最后总结了他们之间的区别,也有练习题的链接

2302_76941579的博客 2万+

【目标检测】yoloV5算法详解

一、与yoloV4相比,yoloV5的改进 输入端:在模型训练阶段,使用了Mosaic数据增强、自适应锚框计算、自适应图片缩放 基准网络:使用了FOCUS结构和CSP结构 Neck网络:在Backbone和最后的Head输出层之间插入FPN_PAN结构 Head输出层:训练时的损失函数GIOU_Loss,预测筛选框的DIOU_nns 二、yoloV5结构框架 CBL:CBL模块是由Conv+BN+Leaky_relu激活函数组成 Res unit:借鉴ResNet中的残差结构,用来构建深层网络,CBM是

qq_40373651的博客 2万+

Android Audio常见问题分析方法

分析audio dump,确定写给BT的data是否正常,MTK平台Android原生架构分析threadloop write节点,高通平台分析QXDM 1586节点,从dump确定问题大概位置。分析systrace 确定性能。AudioFocus状态(用于播放或者音量异常的情况)。AudioTrack是否正常创建bt连接是否正常通路异常,setMode,setSpeakerphoneOn等都会影响设备选择,sco调用流程是否正常。

一条老狗的博客 2387

sizeof()

一、sizeof概念 sizeof()是一个操作符(operator),不是函数。 它的功能是返回一个对象或者类型名的长度,类型为size_t,单位为字节。 size_t是一个依赖编译器的值,定义在头文件stddef.h,一般定义为 typedef unsigned int size_t; 二、sizeof有三种语法: (1)sizeof(object);//sizeof(对象); (2)sizeof(type_name);//sizeof(类型); (3)sizeof object;//si

yaowang107的博客 1万+

【COMSOL】将一个面上数据导出CSV或txt格式的方法

在COMSOL中参数化扫描后,把一个面上或体里的数据按照CSV或TXT格式导出的方法。

dave496206的博客 2988

sizeof()和strlen的区别

首先得区别清楚: sizeof()是运算符,在头文件的类型为unsigned int,其运算值在编译时就计算好了,参数可以是指针、数组、类型、对象和函数等; strlen()是函数,要在运行时才能计算。参数必须是字符型指针(char*)。当数组名作为参数传入时,实际上数组就退化为指针了。该函数完成的功能是从代表该字符串的第一个地址开始遍历的,直到遇到结束符NULL。返回的长度大小不包括NULL。 ...

Victor的BLOG 1万+

【数据同化第一期】基本概念介绍

【数据同化第一期】基本概念介绍

WW、forever的博客 1901

【NLP】第十章:位置编码Positional Encoding

前面讲RNN时一般都会有一个ht的输出,这个输出就是样本与样本之间的信息,而且RNN是时序循环的,所以RNN本身的结构,在物理上,就自带词的前后顺序信息的。比如词never,不管never本身的词向量是什么,只要你在序列中排第一个位置,你的位置向量就是[0,1,01],你排第三个位置,你的位置向量就是[0.9,-0,4,0.2,1.0]。也所以,你可以理解为:embedding后的词嵌入,PE按照每个样本在sequence中的位置,把embedding后的词嵌入给扭转后,才送入attention的。

因为热爱所以坚持 1917

C语言中strlen和sizeof的区别

C语言中,strlen和sizeof使用时的区别和使用方法

川子767的博客 1万+

海洋CMS admin_notify.php 远程代码执行漏洞复现(CVE-2024-30565)

海洋CMS admin_notify.php 接口处存在远程代码执行漏洞,经过身份验证的远程攻击者可利用该漏洞执行任意代码,写入后门文件,进而控制整个web服务器。

0xSec 2712

strlen与sizeof的区别

在了解strlen与sizeof的区别之前,先来了解下字符数组: char a[] = {‘C’,’+’,’+’,};//不含空字符’\0’。 char a1[] = {‘C’,’+’,’+’,’\0’};//显式包含空字符’\0’。 char a2[] = “C++”; //自动添加 ‘\0’字符串结束的空字符 a1=a2。 char a3[4] = “C++”;//错误,没有空间存放空字符’...

c+c++的博客 5937

lwip-2.0.3

lwip是瑞典计算机科学院(SICS)的Adam Dunkels 开发的一个小型开源的TCP/IP协议栈。实现的重点是在保持TCP协议主要功能的基础上减少对RAM 的占用。

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

strlen与sizeof的区别详解

对于 strlen 和 sizeof,相信不少程序员会混淆其功能。虽然从表面上看它们都可以求字符串的长度,但二者却存在着许多不同之处及本质区别。 strlen 是一个函数,它用来计算指定字符串 str 的长度,但不包括结束字符(即 null 字符)。其原型如下面的代码所示: size_t strlen(char const* str); 也正因为 strlen 是一个函数,所以需要进行一次函数调用,调用示例如下面的代码所示: char sArr[] = "ILOVEC"; /*用strlen()求长度*/

qq_41282070的博客 3444

霍尼韦尔SoftMaster使用说明

霍尼韦尔SoftMaster使用说明

关于 strlen 与 sizeof 的区别

关于 strlen 与 sizeof 的区别,我相信很多人都有所了解。以下我总结了几点关于strlen 与 sizeof 的区别和注意事项。 1. strlen 是函数,sizeof 是运算符。 2. strlen 测量的是字符的实际长度,以'\0' 结束。而sizeof 测量的是字符的分配大小。 比如: char str[20] = "hello"; printf("strlen: %

我的博客 3万+

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

C语言中sizeof和strlen的区别

整体看一个代码的效果 #include &amp;lt;stdio.h&amp;gt; #include &amp;lt;string.h&amp;gt; int main(int argc, char const *argv[]) { int a[8]={1,2,3}; char b[]=&quot;love&quot;; printf(&quot;%ld\n&quot;,sizeof(a)); printf(&quot;

apanying的博客 1万+

sizeof 和 strlen 的区别

sizeof和strlen的区别

2301_81703165的博客 1688

sizeof和strlen的区别

sizeof 是操作符,sizeof 计算变量所占内存内存空间⼤⼩的,,如果操作数是类型的话,计算的是使⽤类型创建的变量所占内存空间的⼤⼩。sizeof 只关注占⽤内存空间的⼤⼩,不在乎内存中存放什么数据。

m0_69135494的博客 789

sizeof与strlen的区别

1.sizeof与strlen的定义 1.1sizeof sizeof是C/C++中的一个长度运算符,优先级为2 作用: 是返回一个对象或者类型在内存中所占用的字节数。 注意:sizeof后面如果是类型则必须加括号,如 sizeof(char);而如果是变量名则可以不加括号,如 sizeof a; 但是建议使用时 均加上括号。sizeof不能返回动态地被分配的数组的大小。 1.2 strlen ...

liuurick的博客 390

strlen、length、size、sizeof的用法与区别

各函数用法 一、strlen 头文件 string.h 语法形式: size_t strlen( const char* str); 该函数的默认使用类型是char * 也就是一个char指针类型,所以在判断过程中是根据指针往后找,对于 char p[]或者char *p是可以直接使用的 但是对于直接的string类型,例如:string a=“abc” 这种需要需要用c_str()将C++ string转换为char*类型: strlen(a.c_str()); 函数定义 strlen所作的

weixin_45878105的博客 2454

sizeof和strlen区别

strlen和sizeof

m0_61831521的博客 1039
上一篇: C语言之循环语句
下一篇: 数组练习之二分查找和多个字符从两端向中间汇聚
大力初奇迹
博客等级 码龄3年 1294粉丝 54原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值