sizeof与strlen区别

news2024/11/19 11:18:02
一、sizeof与strlen区别

sizeof是关键字,参数可以是各种数据(包括函数,类型,对象,数组,指针……)用于计算数据所占字节大小

strlen是函数,参数类型必须是字符型指针(char *),用于计算字符串,从字符串的第一个地址开始遍历,直到遇到‘\0’停止

二、sizeof(字符型数组)、strlen(字符型数组)

sizeof(字符型数组):

int main()
{
    char arr[] = { 'a','b','c','d','e','f' };

    printf("%zd\n", sizeof(arr));//6           此处arr代表整个数组,整个数组6个字符,总字节数为6
    printf("%zd\n", sizeof(arr + 0));//4/8     此处arr+0为首元素地址,地址的大小是4或8个字节
    printf("%zd\n", sizeof(*arr));//1          此处*arr是首元素,即字符a,大小为1字节
    printf("%zd\n", sizeof(arr[1]));//1        此处arr[1]是字符b,大小为1字节
    printf("%zd\n", sizeof(&arr));//4/8        此处&arr为整个字符数组的地址,地址的大小为4或8个字节
    printf("%zd\n", sizeof(&arr + 1));//4/8    此处&arr+1为整个字符数组的地址+1,仍然是地址,地址的大小是4或8个字节
    printf("%zd\n", sizeof(&arr[0] + 1));//4/8 此处&arr[0]+1是字符a的地址+1,仍然是地址,地址的带笑傲是4或8个字节
    return 0;
}

strlen(字符型数组):

int main()
{
    char arr[] = { 'a','b','c','d','e','f' };

    printf("%d\n", strlen(arr));//随机值         此处arr代表首字符地址,也是字符指针,符合参数要求,strlen遇到\0停止,数组中没有\0,因此为随机值
    printf("%d\n", strlen(arr+0));//随机值       此处arr+0代表首字符地址+0,仍然是首字符地址,也是字符指针,符合参数要求,strlen遇到\0停止,数组中没有\0,因此为随机值
    //printf("%d\n", strlen(*arr));//报错          此处*arr是字符a,不符合参数要求
                                              //(在strlen函数的角度来看,函数会将传入的任何数据,都当作为字符指针,也就是地址,字符a的ASCII码值为97,97作为地址直接访问,该行为是非法的,报错)
   // printf("%d\n", strlen(arr[1]));//报错        此处arr[1]是字符b,不符合参数要求
                                              //(在strlen函数的角度来看,函数会将传入的任何数据,都当作为字符指针,也就是地址,字符a的ASCII码值为97,97作为地址直接访问,该行为是非法的,报错)
    printf("%d\n", strlen(&arr));//随机值        此处&arr是整个字符数组的地址,符合参数要求,但是不知何时会遇到\0,因此为随机值
    printf("%d\n", strlen(&arr + 1));//随机值    此处&arr是整个数组的地址+1,仍然是地址,符合参数要求,但是不知何时会遇到\0,因此是随机值
    printf("%d\n", strlen(&arr[0] + 1));//随机值 此处&arr[0]+1是字符a的地址+1,仍然是地址,符合参数要求,但是不知何时会遇到\0,因此是随机值
    return 0;
}

 三、sizeof(字符串)、strlen(字符串)

sizeof(字符串):

int main()
{
    char arr[] = "abcdef";
    printf("%zd\n", sizeof(arr));//7            此处arr是整个数组(字符串),字符串中除了abcdef还有末尾的\0,因此一共7个字节
    printf("%zd\n", sizeof(arr + 0));//4/8      此处arr+0是首元素地址+0,结果仍然是首元素地址,地址占4/8个字节
    printf("%zd\n", sizeof(*arr));//1           此处*arr是字符a,大小为1个字节
    printf("%zd\n", sizeof(arr[1]));//1         此处arr[1]是字符a,大小为1个字节
    printf("%zd\n", sizeof(&arr));//4/8         此处&arr是整个字符串的地址,地址的大小是4/8个字节    
    printf("%zd\n", sizeof(&arr + 1));//4/8     此处&arr+1是整个个字符串的地址+1,仍然是地址,地址的大小是4/8个字节
    printf("%zd\n", sizeof(&arr[0] + 1));//4/8  此处&arr[0]+1是字符a的地址+1,仍然是地址,地址的大小是4/8个字节

    return 0;
}

strlen(字符串):

int main()
{
    char arr[] = "abcdef";
    printf("%d\n", strlen(arr));//6            此处arr是首字符地址,即字符a的地址,符合strlen函数参数要求,从起始地址开始遍历遇到\0停止,一共6个字节
    printf("%d\n", strlen(arr + 0));//6        此处arr+0是首字符地址+0,结果仍然是首字符a的地址,符合strlen函数参数要求,从起始地址开始遍历遇到\0停止,一共6个字节
    //printf("%d\n", strlen(*arr));//报错      此处*arr是字符a,不符合strlen函数参数要求
                                 //            在strlen函数的角度来看,它会将任何传给它的数据都当作为地址,字符a的ASCII码值为97,97作为地址直接访问,一定是非法的
    //printf("%d\n", strlen(arr[1]));//报错    此处arr[1]是字符b,不符合strlen函数参数要求
                                   //          在strlen函数的角度来看,它会将任何传给它的数据都当作为地址,字符b的ASCII码值为98,98作为地址直接访问,一定是非法的
    printf("%d\n", strlen(&arr));//6           此处&arr是取整个字符串的地址,符合strlen函数参数要求,整个字符串的地址和首字符地址相同,因此strlen函数会将首字符地址作为起始地址,从此处开始遍历,一共6个字符,共6个字节
    printf("%d\n", strlen(&arr + 1));//随机值  此处&arr+1是整个字符串的地址+1,结果是\0后面的地址,strlen函数将这个地址作为起始地址,从\0后面开始遍历,无法确定什么时候会再次遇到\0,因此为随机值
    printf("%d\n", strlen(&arr[0] + 1));//5    此处&arr[0]+1是字符a的地址+1,结果是字符b的地址,那么strlen函数将把字符b的地址当做起始地址,从此处开始遍历,一共5个字符,共5个字节
    return 0;
}

四、sizeof(字符串指针)、strlen(字符串指针)

sizeof(字符串指针):

int main()
{
	char* p = "abcdef";//字符串也是一个表达式,其值是首字符的地址,即字符a的地址
	
	printf("%d\n", sizeof(p));//4/8	此处p是字符a的地址,地址的大小是4或8字节
	printf("%d\n", sizeof(p + 1));//4/8	此处p+1是 字符a的地址+1,结果仍然是地址,地址的大小是4或8字节 
	printf("%d\n", sizeof(*p));//1	此处*p是字符a,字符a的大小是1字节
	printf("%d\n", sizeof(p[0]));//1	此处p[0]是字符a,字符a的大小是1字节
	printf("%d\n", sizeof(&p));//4/8	此处&p取的是指针变量p的地址,地址的大小是4或8字节
	printf("%d\n", sizeof(&p + 1));//4/8	此处&p+1是指针变量p的地址+1,结果仍然是地址,地址的大小是4或8字节
	printf("%d\n", sizeof(&p[0] + 1));//4/8	此处&p[0]+1是字符a的地址+1,结果是字符b的地址,地址的大小是4或8字节

	return 0;
}

strlen(字符串指针):

int main()
{
    char* p = "abcdef";//字符串也是一个表达式,其值是首字符的地址,即字符a的地址

    printf("%d\n", strlen(p));//6   此处p是字符a的地址,符合strlen函数参数要求,将字符a的地址作为起始地址向后遍历,直到遇到\0停止,一共6个字符
    printf("%d\n", strlen(p + 1));//5   此处p+1是字符a的地址+1,结果是字符b的地址,符合strlen函数参数要求,将字符b的地址作为起始地址向后遍历,直到遇到\0停止,一共5个字符
    //printf("%d\n", strlen(*p));//报错 此处*p是字符a,不符合strlen函数参数要求,报错
    //printf("%d\n", strlen(p[0]));//报错,此处p[0]是字符a,不符合strlen函数参数的要求
    printf("%d\n", strlen(&p));//随机值    此处&p是取指针变量p的地址,将p的地址作为起始地址向后遍历,但不知道何时回遇到\0,因此为随机值
    printf("%d\n", strlen(&p + 1));//随机值    此处&p+1是指针变量p的地址+1,将次地址作为起始地址向后遍历,但不知道何时会遇到\0,因此为随机值
    printf("%d\n", strlen(&p[0] + 1));//5   此处&p[0]+1是字符a的地址+1,结果是字符b的地址,将字符b的地址作为起始地址向后遍历,直到遇到\0停止,一共5个字符

    return 0;
}

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

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

相关文章

检验过程管理

声明 本文是学习GB-T 42893-2023 电子商务交易产品质量监测实施指南. 而整理的学习笔记,分享出来希望更多人受益,如果存在侵权请及时联系我们 1 范围 本文件提供了开展电子商务交易的有形产品质量监测的总则,监测准备、监测实施、监测效果评价 与反馈等过程指导…

vue在el-tab中使用echart(出现canvas高宽一直是100px问题+echart随外层div变化而自适应)

问题1:canvas高宽一直是100px问题 解决方法:使用v-if,参考文献https://blog.csdn.net/qq_42527726/article/details/106147539?utm_mediumdistribute.pc_relevant.none-task-blog-2~default~baidujs_utm_term~default-0-106147539-blog-132323416.235^…

全流量安全分析的重要性

网络安全的重要性体现在以下几个方面: 保护数据安全:随着数字化时代的到来,企业和组织的数据变得越来越重要和敏感。网络安全能够有效保护敏感数据不被未授权的访问、篡改或泄露。通过加密、访问控制、身份认证等手段,网络安全确…

Redis怎么测?这篇文章写的太全了

Redis是一个高性能、内存数据库和缓存系统,在开发和生产环境中被广泛应用。本文将介绍如何进行有效的Redis软件测试,以确保其稳定性、高性能和可靠性。 Redis作为一种非关系型数据库和缓存系统,被广泛用于支持高流量、低延迟的应用。为了保证…

从技术创新到应用实践,百度智能云发起大模型平台应用开发挑战赛!

大模型已经成为未来技术发展方向的重大变革,热度之下更需去虚向实,让技术走进产业场景。在这样的背景下,百度智能云于近期发起了“百度智能云千帆大模型平台应用开发挑战赛”。 挖掘大模型落地应用 千帆大模型平台应用开发挑战赛启动 在不久…

短视频无人直播双端开播源码部署

设置语音 商家可以通过语音库,完成直播间语音设置,支持人声录制和智能配音直播间语音 语音库 语音库列表 语音库名称 语音库 录音 合成配音 进入“语音库” 可编辑、删除语音库 列表右下角-添加语音库-输入语音库名称 针对每个语音库&#…

Lua学习笔记:require非.lua拓展名的文件

前言 本篇在讲什么 Lua的require相关的内容 本篇需要什么 对Lua语法有简单认知 对C语法有简单认知 依赖Visual Studio工具 本篇的特色 具有全流程的图文教学 重实践,轻理论,快速上手 提供全流程的源码内容 ★提高阅读体验★ 👉 ♠…

ChatGPT的问世给哪些行业带来了冲击?

目录 引言Chat GPT 对行业的影响在线客服和智能客服行业传统自动回复机器人的局限性Chat GPT 的提升能力 教育培训行业个性化学习需求的挑战Chat GPT 的个性化优势 金融保险行业客户服务的变革Chat GPT 的智能化应用 医疗健康领域自助诊断及咨询的便利性Chat GPT 在医疗领域的应…

Spring学习笔记11 GoF代理模式

Spring学习笔记10 JdbcTemplate_biubiubiu0706的博客-CSDN博客 新建个maven模块 static-proxy 演示静态代理 订单接口 测试 需求:统计每个业务方法的耗时 package com.example.proxy.service;/*** author hrui* date 2023/9/25 8:42*/ public class OrderServiceImpl implem…

云安全【阿里云ECS攻防】

关于VPC的概念还请看:记录一下弹性计算云服务的一些词汇概念 - 火线 Zone-安全攻防社区 一、初始化访问 1、元数据 1.1、SSRF导致读取元数据 如果管理员给ECS配置了RAM角色,那么就可以获得临时凭证 如果配置RAM角色 在获取ram临时凭证的时候&#xff…

Android平台轻量级RTSP服务模块如何实现一个服务发布多路RTSP流?

我们在做Android平台轻量级RTSP服务和内网RTSP网关的时候,遇到过这样的问题,如何同时发布多路RTSP流出去? 回答这个问题,实际上不难,大牛直播SDK在设计这个模块的时候,考虑到了一个Service带多路流的情况&…

【Axure高保真原型】滑动评分条_自由控制起始数值

今天和大家分享能自动控制起始数值的滑动评分条的原型模板,我们可以左右拖动滑块或者点击滑条让滑块移动到点击的位置,评分的数值能根据滑块的位置自动计算;我们也可以控制左右侧输入框里的数值,从而控制滑动评分条的区间&#xf…

什么是Peppol ID?如何创建?

Peppol 网络的两大优势是安全和高效,由于Peppol 最常用于电子发票,因此这些优势在电子发票上展露无遗。相比之下,通过电子邮件发送 PDF 格式的发票和其他文件不仅处理成本较高,而且容易出现发票欺诈。 如果您所在的公共部门组织或…

游戏联运和游戏自主运营有什么区别?哪个更好?

游戏联运和游戏自主运营是两种不同的运营模式,各有优劣势,选择取决于具体情况和目标。 一、游戏联运 游戏联运是指将游戏交由第三方发行商或合作伙伴进行运营和推广。这些合作伙伴通常有更丰富的市场经验和资源,能够协助游戏进入不同地区和平…

Linux环境下使用SVN快速访问资料库?试试使用cpolar端口映射

文章目录 前言1. Ubuntu安装SVN服务2. 修改配置文件2.1 修改svnserve.conf文件2.2 修改passwd文件2.3 修改authz文件 3. 启动svn服务4. 内网穿透4.1 安装cpolar内网穿透4.2 创建隧道映射本地端口 5. 测试公网访问6. 配置固定公网TCP端口地址6.1 保留一个固定的公网TCP端口地址6…

LeetCode的第 363 场周赛——记录+补题

研究生生涯第一次打力扣周赛——3题 1. 计算 K 置位下标对应元素的和 class Solution { public:int cnt(int x){int sum 0;while (x) {sum ((x%2)?1:0);x/2;}return sum;}int sumIndicesWithKSetBits(vector<int>& nums, int k) {int n nums.size();int ans 0…

qiankun微服务搭建遇到的坑

目录 1.子应用vue.config中的headers设置成可跨域请求 2.output设置成library&#xff0c;打包成umd库格式 3.父应用使用了babel-pollfill&#xff0c;子应用不要在在bable-pollfill 4.iconfont.js要取消样式隔离才能生效 5.关于nginx的配置 6.主应用和各应用相同依赖的版…

【周赛364-单调栈】美丽塔 II-力扣 2866

&#x1f49d;&#x1f49d;&#x1f49d;欢迎来到我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里可以感受到一份轻松愉快的氛围&#xff0c;不仅可以获得有趣的内容和知识&#xff0c;也可以畅所欲言、分享您的想法和见解。 推荐:kuan 的首页,持续学…

华为OD机试 - 相同数字组成图形的周长 - 矩阵(Java 2023 B卷 100分)

目录 专栏导读一、题目描述二、输入描述三、输出描述四、Java算法源码五、效果展示1、输入2、输出 华为OD机试 2023B卷题库疯狂收录中&#xff0c;刷题点这里 专栏导读 本专栏收录于《华为OD机试&#xff08;JAVA&#xff09;真题&#xff08;A卷B卷&#xff09;》。 刷的越多…