深层次分析字符数组和字符串的区别是什么?

2023-10-31

前言

(1)休闲时刻刷B站,看到一个卖课的,发视频问,char arr1[]={‘H’,‘E’,‘L’,‘L’,‘O’};和char arr2[]=“HELLO”;区别是什么。
(2)看那个卖课博主一顿分析,最后成功得出:字符串比字符数组末尾多一个’\0’。
(3)很好,成功浪费我生命的3分钟。无语,就这水平还卖课。如果各位有幸看到这货,希望能够保持清晰,不要被这种无良卖课机构欺骗。
(4)为了防止被当成地图炮,我声明一下,我只diss那种没啥实力乱忽悠的买课机构。对于教干货的培训机构,我还是保持尊重态度的!

浅层分析

存储大小

(1)就像那个卖课说的一样,字符串比字符数组末尾多一个’\0’。因此字符串比字符数组的大小比字符数组大一个字节。

char arr1[]={'H','E','L','L','O'};
char arr2[]="HELLO";
sizeof(arr1);  //返回5
sizeof(arr2);  //返回6,因为最后有一个'\0'

strlen()测试结果不一样

(1)那个卖课的也没有水到无药可救,这个程度还是分析到了,我还是有些许欣慰的。
(2)我们需要知道strlen()函数作用是什么。strlen()函数可以计算字符串的大小,而strlen()函数底层实现是什么呢?
(3)说白了一点一点的往后爬,,直到找到了ascii中的0。找到0之后,退出while循环,然后根据地址相减,就可以得出字符串长度。(注意:因为char只有一个字节,所以地址相减就可以直接得出字符串长度)
<1>可能还有一些同学没有理解,我直接拿上面的"hello"字符串分析,假设"hello"字符串首字符’h’的地址为0x50。因此传入strlen()函数的str的值为0x50。
<2>const char *s = str; 经过这一句,s也是0x50。
<3>第一次while(),*s为0x48(字符’H’的ASCII值是0x48),所以进入循环,s自增,从0x50变成0x51。
<4>按照<3>的步骤来4次,s是0x54的时候,在 while (*s)的时候,*s为0x4F(字符’O’的ASCII值是0x48),此时s再次自增。
<5>关键来了,第五次while (*s)的时候,我们发现,*s的值居然是0!于是退出while()循环。
<6>然后s - str =5即可计算出字符串长度了。

在这里插入图片描述

size_t strlen(const char *str) {
    const char *s = str;
    while (*s)
        s++;
    return s - str;
}

(4)现在我们知道了strlen的原理之后,我们再看看字符数组。字符数组中,char arr1[]={‘H’,‘E’,‘L’,‘L’,‘O’};的字符’O’后面的值是未知的,可能是0也可能是一些其他值,所以strlne()测试出来的字符数组长度是无法确定的!

总结

(1)上面这些都是非常浅显的知识,但凡认真学了C语言都懂的,真心搞不懂那个卖课的搞到那么神秘兮兮的干嘛。
(2)总结起来就是字符串比字符数组末尾多一个’\0’,因此导致存储大小和strlen()结果不一致。

深层分析

存储位置不一样

(1)字符串是存储在常量区的,一般来说,常量区存储在ROM中。
(2)字符数组存储位置要看情况而定。但是都是存储在RAM。
<1>如果字符数组是全局变量,就存储在静态数据区。
<2>如果字符数组是局部变量,就存储在栈中。

修改权限不一样

(1)字符串是存储在常量区的,所以说,字符串没有修改权限。CPU无法对字符串修改。
(2)字符数组要么是静态数据,要么是栈中。CPU都能够对字符数组进行修改。

断电存储大小不一样

(1)对于字符串而言,他是在常量区,所以即使机器断电,他的数据依旧存在。
(2)但是对于字符数组而言,假如他是局部变量。断电之后他的数据就会消失了。但是字符数组是全局变量他的数据还是会存在于ROM。
(3)这么不明白的同学,可以看RAM明明断电会丢失数据,为什么初始化的全局变量存储在RAM?详细分析程序的存储

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

深层次分析字符数组和字符串的区别是什么? 的相关文章

  • Unity Vuforia(高通)AR全流程

    Unity Vuforia播放视频全过程 从Unity的安装到打包 一 安装Unity 1 点击安装地址下载Unity Hub 下载好之后点击安装 2 从Unity Hub进去安装Unity 要先注册登陆账号 安装完后是这样的 二 新建项目
  • Vue+Element-UI Table表头排序

    Vue Element UI Table表头排序 Vue代码 定义后台需要接受的排序属性 排序sortChange Vue代码
  • js控制输入框

    转自 http www pinlue com article 2019 11 2221 409812495947 html
  • 【C++11】——右值引用、移动语义

    目录 1 基本概念 1 1 左值与左值引用 1 2 右值和右值引用 1 3 左值引用与右值引用 2 右值引用实用场景和意义 2 1 左值引用的使用场景 2 2 左值引用的短板 2 3 右值引用和移动语义 2 3 1 移动构造 2 3 2 移
  • 推荐算法(一):协同过滤系列

    一 协同过滤 collaborative filtering 一种ItemCF推荐baseline 1 输入 user item相关矩阵 2 中间结果 item间相似度计算 item i与item j间相似度 分子 与二者均有关联的user
  • 【Hadoop生态圈】3.Zookeeper入门教程及集群环境搭建

    文章目录 1 简介 2 环境准备 3 修改Zookeeper配置文件 4 复制安装包到从节点并设置myid 5 启动集群 6 zkCli常用命令 1 简介 ZooKeeper是一个分布式的 开放源码的分布式应用程序协调服务 是Google的
  • ChatGPT是否会终结申请海外留学的文书时代?

    ChatGPT的爆火 也让不少准留学生们不禁会问 这一技术的产生是否会影响申请文书的写作 美国Insidehighered的专栏作家Jim Jump给出了自己的观点 ChatGPT对热爱文字和从事教育工作的人提出了特别的挑战 如果老师不能确

随机推荐

  • Unity中UGUI中各类UI元素跟随画面适应问题

    案例背景 这是一个即将发布陈web 版并且在手机上观看的 小交互 我要保证左上角按钮 保持相对位置不变 最终设置如下 简单版教程 很简单 Unity为每个UI元素提供了一个Rect Transform 里面有个Anchors 锚点 Unit
  • 如何搭建虚拟专有网络访问公司内网

    前言 因为公司开发都是内网环境 以往居家办公或非公司环境 都需要进行远程到公司电脑进行办公 为了方便部门同事出差驻场开发 搭建了虚拟专有网络 在实际搭建过程中使用了OpenVPN和SoftEtherVPN两种方式 做个总结记录 个人还是更推
  • python 解析大疆禅思L1 激光数据LDR格式

    个人微信 394467238 最近想把大疆禅思L1 录制的激光 LDR 数据 也就是把里面的数据一帧一帧的抽取出来 然后和图像数据做一个匹配 奈何问了一圈大疆的技术支持 就是不对外开放这个数据保存的协议 木有办法 只好自己动手尝试硬破解了
  • beanUtils封装表单数据到javaBean

    当表单数据多的时候避免太多的request getParament 方式获取数据 关键方法 BeanUtils populate p req getParameterMap 本例 获取前端表单数据 封装到javabean 练习中写了一些反射
  • OpenWRT安装docker内核kernel版本不够

    记录下 在openwrt中安装docker docker compose dockerd遇到如下错误 Collected errors pkg hash check unresolved cannot find dependency ker
  • 编程新手表示很想知道JAVA中Bean是什么?

    原文 编程新手表示很想知道JAVA中Bean是什么 NanSan 小编发现很多人都在问JAVA中Bean是什么 简单笼统的说就是一个类 一个可复用的类 这样的解释可能看着都还是云里雾里 跟没说一样 下面详细介绍吧 javaBean在MVC设
  • 拷贝构造函数的一个对象访问私有成员的问题

    最近遇到这样一个面试题 面试题 CString函数拷贝控制成员的编写 过程中遇到一个问题 真是当时让我疑惑不解 查查资料 原来是一时糊涂 看看人家的解答 不错 遂转一下 很简单 就是当时没转过弯来 原文如下 http blog csdn n
  • MapReduce运行流程

    MapRecude运行流程 1 客户端提交代码 job watiforcompletion 开始运行 2 请求到ResourceManager 经理 请求运行 ResourceManager返回jobId 和让客户端提交资源的路径 3 客户
  • 【黑马点评】达人探店

    黑马点评 达人探店 1 发布探店笔记 探店笔记类似点评网站的评价 往往是图文结合 对应的表有两个 tb blog 探店笔记表 包含笔记中的标题 文字 图片等 tb blog comments 其他用户对探店笔记的评价 具体发布流程 根据找到
  • STM32CubeProg 下载及安装教程

    先点赞 再看博客 顺便点个关注鼓励一下 如果文章看完 觉得不错的话可以点个收藏 日后不迷路 STM32CubeProg 下载及安装教程 1 前言 1 1 基本介绍 1 2 主要特点 1 3 准备工作 2 软件下载 2 1 Java 官网下载
  • 字符串转base64,base64转字符串

    JavaScript原生提供两个Base64相关方法 btoa 字符串或二进制值转为Base64编码 atob Base64编码转为原来的编码 注意 base64转码为 号的后台存储问题 可遍历将 号转换为其他字符 备注 利用这两个原生方法
  • 用 visio 2013 绘制倾斜立方体

    依次点击 形状 更多形状 常规 方块 2 选择 三维框 形状即可 后续可根据需求对其进行缩放 变形 反转等操作
  • Centos 7配置网络文件及命令

    1 查看网络配置文件 命令行执行ip addr或ifconfig可以知道为ens33 然后cd 到目录 etc sysconfig network scripts 可以看到ifcfg ens33就是我们要找的文件 然后进入编辑 配置ip d
  • Thread & Timer

    Thread Timer 待续
  • element v-loading 文字描述 icon颜色 字体颜色

    v loading mapInfoLoading element loading text 数据加载中 class loading map icon颜色和字体颜色
  • windows CE初次接触(一次升级长安致尚XT高德导航的经历)

    以前不知道windows 操作系统在车载导航方面也有应用 即windows CE 帮忙升级一个 长安致尚XT 汽车上的windows CE下的 高德导航 注意到这是 百度收购 了的 提供免费地图的品牌 现在这篇文章应该用不上了 高德导航是被
  • Shortest Prefixes

    http poj org problem id 2001 Description A prefix of a string is a substring starting at the beginning of the given stri
  • SpringCloud使用ribbon做负载均衡时报错,无法根据服务名查找相应的服务

    SpringCloud使用ribbon做负载均衡时报错 无法根据服务名查找相应的服务 报错信息 报错原因 解决方案 第一种 第二种 报错信息 jjava lang IllegalStateException Request URI does
  • Neo4j数据建模优化:双向关系

    原文链接 http graphaware com neo4j 2013 10 11 neo4j bidirectional relationships html 我们通常会将现实生活中的关系型数据 通过一定的方式 转化为图形化的结构存储起来
  • 深层次分析字符数组和字符串的区别是什么?

    前言 1 休闲时刻刷B站 看到一个卖课的 发视频问 char arr1 H E L L O 和char arr2 HELLO 区别是什么 2 看那个卖课博主一顿分析 最后成功得出 字符串比字符数组末尾多一个 0 3 很好 成功浪费我生命的3