C语言——sizeof与strlen的对比

一.sizeof 

 我们在学习操作符的时候,就了解到了sizeof操作符,它的作用是求参数所占内存空间的大小,单位是字节。如果参数是一个类型,那就返回参数所占的字节数。

#include <stdio.h>int main()
{int a = 10;size_t b = sizeof(a);//a的类型是int型,在内存中占四个字节,所以结果为4size_t c = sizeof(int);//int类型的数据在内存中占四个字节,所以结果也是4printf("%d %d\n", b, c);
}

我们可以像上面代码一样来计算变量或者一个类型的大小。当然,sizeof()的参数还可以是表达式,但是当表达式作为参数时,表达式是不进行计算的,sizeof只会推断表达式结果的类型,并不会真实计算。

#include <stdio.h>int main()
{int a = 10;int b = 1;size_t c = sizeof(a = a + b);//sizeof()不会计算参数内的表达式,只会推断表达式结果的类型//故打印结果为: a = 10 4printf("a = %d %zd\n", a, c);return 0;
}

当我们使用sizeof操作符的时候,接受返回值的参数最好定义成size_t类型的,打印时用%zd打印。因为sizeof求得是参数在内存中所占的大小,那肯定不可能是负数,所以我们最好用无符号数来接收。size_t表示无符号整型,%zd用来打印无符号整型。

二.sizeof的特殊情况

当sizeof()内的参数为数组名的时候,sizeof求的是整个数组的大小,就不再是类型的大小了。

#include <stdio.h>int main()
{int arr[] = { 1,2,3,4,5,6,7,8,9,10 };size_t a = sizeof(arr);//当sizeof()的参数为数组名的时候,求的就是整个数组的大小,单位为字节。size_t b = sizeof(arr[0]);//当sizeof()的参数为数组中的一个元素的时候,求得就是该元素类型的大小。//arr有10个元素,每个元素四个字节,所以a 的值就是4*10 = 40printf("%zd %zd\n", a, b);return 0;
}

我们知道了这个之后,就可以利用这个特殊点来求数组元素的个数。我们只需要将数组的大小除以一个元素的大小就可以得到数组的元素个数啦!

#include <stdio.h>//利用sizeof遇到数组名的特殊,可以求数组的长度
int main()
{int nums[] = { 1,2,4,2,5,6,76,3,7543,55,3534,32 };size_t numsSize = sizeof(nums) / sizeof(nums[0]);printf("%zd\n", numsSize);return 0;
}

三.strlen

strlen是C语言中的一个库函数,头文件为<string.h>,strlen是用来求字符串长度的。它的运行逻辑为:传给它一个字符串地址,它就从这个位置开始往后数,直到遇到'\0'停止,所以,strlen就是统计从起始位置到’\0‘之间的字符个数。

#include <stdio.h>
#include <string.h>//strlen(),求从传过去的字符串地址开始,向后开始数,知道遇到第一个'\0'后停止,统计遇到的字符个数
//使用strlen函数要包含头文件<string.h>
int main()
{char string[] = "abcdef";size_t len = strlen(string);printf("%zd\n", len);return 0;
}

我们知道了strlen函数是统计起始位置到’\0‘之间的字符个数,所以所传字符串内部必须包含’\0‘。

#include <stdio.h>
#include <string.h>int main()
{char string1[] = { 'w','o','r','l','d' };//1char string2[] = "world";//2size_t len1 = strlen(string1);size_t len2 = strlen(string2);printf("%zd %zd\n", len1,len2);return 0;
}

当我们以方式1的形式定义字符串的时候,需要我们自己在结尾加上’\0‘,否则该字符串就无’\0‘,此时如果直接将地址传给strlen函数,strlen在统计’d'之后没有遇到’\0‘,所以不会停止,会继续往后统计,直到遇到’\0‘,所以此时打印len1,结果为随机值。

而当我们以方法二定义字符串的时候,编译器会自动给字符串末尾添加’\0‘,所以不需要自己添加,strlen对其求值时就能正常得出字符串的长度。

上述代码结果为:

如果我们在字符串中添加’\0‘,strlen就会提前停止。

四.sizeof与strlen的对比

sizeofstrlen
1.sizeof是操作符1.strlen是库函数,使用strlen函数要包含头文件<string.h>
2.sizeof计算参数所占内存空间的大小,单位是字节2.strlen求字符串长度,统计从起始位置到'\0'之间的字符个数
3.sizeof不会计算括号内的表达式,只会推断表达式结果的类型3.strlen所计算的字符串必须包含'\0',否则会继续往后找,造成越界,其结果为随机值

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

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

GEE入门及进阶教程|在 Earth Engine 中过滤图像集合

Earth Engine API 为 ImageCollection 类型提供了一组过滤器&#xff0c;过滤器可以根据空间、时间或属性特征来限制 ImageCollection&#xff0c;即可将图像从 ImageCollection 中分离出来以进行检查或操作。 图1 1 Earth Engine 中应用于图像集合的过滤、映射…

AugmentedReality之路-创建工程及主界面(1)

本文从零创建1个工程&#xff0c;并添加1个BasicMap和1个主界面&#xff0c;主界面包含Start AR和Stop AR两个按钮 1、创建移动端工程并打包运行 创建1个空工程&#xff0c;选择C&#xff0c;Mobile&#xff0c;Scalable&#xff0c;勾选StarterContent 通过Edit->Proje…

云原生网络魔术师:Docker高级网络实战演练与深度解析

在Docker的世界中&#xff0c;网络无疑是一块充满魔力的土地。当我们超越了基础的网络配置&#xff0c;步入Docker高级网络领域时&#xff0c;你会发现一个全新的、强大而灵活的网络模型正在等待你的探索。本文将带你亲历Docker高级网络实战操作&#xff0c;揭开overlay网络、自…

【数据分享】2012-2023年中国范围的逐年NPP/VIIRS夜间灯光数据(免费获取)

在之前的文章中我们分享了2012-2023年全球范围逐年NPP/VIIRS夜间灯光数据&#xff08;可查看之前的文章获悉详情&#xff09;&#xff01;很多小伙伴在拿到数据后&#xff0c;反映数据太大了&#xff0c; 有450G&#xff0c;下载非常不方便&#xff01;这个数据的范围是全球的&…

手撕算法-删除链表的倒数第 N 个结点

描述 思路 快慢指针&#xff0c;快指针先走N步&#xff0c;走不够N步返回空。慢指针和快指针一起走&#xff0c;当快指针到达终点&#xff0c;即快指针为null时&#xff0c;慢指针到达倒数第N个节点。因为要删除倒数第N个&#xff0c;所以要记录之前的节点pre&#xff0c;假设…

Qualcomm AI Hub-示例(二)模型性能分析

文章介绍 模型性能分析&#xff08;Profiling&#xff09; 当模型尝试部署到设备时&#xff0c;会面临许多重要问题&#xff1a; 目标硬件的推理延迟是多少&#xff1f;该模型是否符合一定的内存预算&#xff1f;模型能够利用神经处理单元吗&#xff1f; 通过在云端的物理设…

从零开始学HCIA之网络基础知识02

1、TCP/IP&#xff08;Transmission Control Protocol/Internet Protocol&#xff09;参考模型&#xff0c;它是当下实际的业界标准。 2、TCP/IP这个名字来自该协议簇中两个非常重要的协议&#xff0c;一个是IP&#xff08;Internet Protocol&#xff09;&#xff0c;另一个是T…

Django 三板斧、静态文件、request方法

【一】三板斧 【1】HttpResponse &#xff08;1&#xff09;介绍 HttpResponse是Django中的一个类&#xff0c;用于构建HTTP响应对象。它允许创建并返回包含特定内容的HTTP响应。 &#xff08;2&#xff09;使用 导入HttpResponse类 from django.http import HttpResponse创…

Linux:Prometheus的源码包安装及操作(2)

环境介绍 三台centos 7系统&#xff0c;运行内存都2G 1.prometheus监控服务器&#xff1a;192.168.6.1 主机名&#xff1a;pm 2.grafana展示服务器:192.168.6.2 主机名&#xff1a;gr 3.被监控服务器&#xff1a;192.168.6.3 …

二叉树的遍历及线索二叉树试题解析

一、单项选择题 01.在下列关于二叉树遍历的说法中&#xff0c;正确的是( C ). A.若有一个结点是二叉树中某个子树的中序遍历结果序列的最后一个结点&#xff0c;则它一定是该子树的前序遍历结果序列的最后一个结点 B.若有一个结点是二叉树中某个子树的前序遍历结果序列的最后一…

多态的左膀右臂,向上转型与重写

同一个引用 调用了 同一个方法&#xff0c;但是因为引用的对象不一样&#xff0c;所表现的行为不一样&#xff0c;我们把这种思想称为&#xff1a;多态 目录 1.向上转型 1.1.向上转型定义 1.2.向上转型的优缺点 1.3.向上转型的内存指向 1.4.向上转型的三种方式 1.5.向下…

【学习】软件测试行业未来的发展趋势预测

近年来&#xff0c;随着中国数字经济的蓬勃发展&#xff0c;软件测试行业也迎来了新的春天。从早期的手工测试到自动化测试&#xff0c;再到持续集成和持续交付&#xff0c;中国的软件测试行业经历了快速的发展和变革。各行各业均对软件测试提出了更高的要求&#xff0c;尤其在…