IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> C++知识库 -> 关于C语言中char*a[]空间分配问题的一旦感悟 -> 正文阅读

[C++知识库]关于C语言中char*a[]空间分配问题的一旦感悟

大学时候没好好学,导致实际用诸如char *a[]的时候,畏畏缩缩的,含泪花了1整体系统地复习了一下,记录一下学习心得。

问题1:如果定义了一个字符指针char *a,问系统到底因为这句话,分配了多大的空间?

对于涉及不到底层的同学,可能一辈子都不会考虑这个问题,而堆或者栈,一旦硬件大小确定了,它的空间就定死了,你每定义一个变量,这块空间就要划出相应的大小,甚至略大于这个大小(地址对齐),用来分配给你定义的变量。有时候我就比较好奇,系统到底分配了多大给我定义的变量。

以前没学好,一直以为分配了char的大小,就一个byte的大小,结果现在知道了,对于指针来说,指针分配空间是一个int的空间大小,即sizeof(int),不同环境下这个值是不一样的,我这里就默认int是32位,即4个bytes了。而带来的问题是,我用char定义了一个指针,分配的是32位地址,那我这个char又是干什么用的?我的理解是,可以想象成偏移地址,即需要连续读取的长度。举例说明一下:

如上图,如果a = 0x01,那么*a = 2,相当于寻址时,a代表了我要寻找的起始地址,而char决定了我的从这个起始地址开始要寻找的长度,由于char占用1个byte,即len为1,于是得到结果*a = 2。类比一下,如果我定义的是int *a,然后a = 0x01,那么*a会是多少了?再来类比分析一下,a=0x01,那么起始地址是0x01,那么我要连续读多少位呢?一个int的大小,即32位,4个bytes,那么0x01~0x04这4位都将被寻址到。对于小端设备,*a = 0x05040302。

?所以说,对于char *a问题,其实系统给你分配的地址大小为一个指针的大小,而前面的char只是用来寻址的偏移量,跟系统分配空间没有关系

问题2:char *a = "i love currant",这期间系统分配了多大空间?

虽然这只有一句话,但是系统却做了3件事情:

1.首先在常量区,释放了14个bytes的空间,用来存"i love currant",并且为了区分中止,自动在结尾释放了一个1byte放‘\0’,所以常量区就消耗了至少15个btyes;

2.定义了一个指针a,释放了一个指针的大小,即4个bytes;

3.将a 等于?"i love currant"这句话的首地址,即a指向这句话的首地址。

由问题2引申3个问题:

问题2.1:如果char b = a[2],b等于多少?

a指向"i love currant"的首地址,即i的地址,偏移2位,所以b = ‘l’;

问题2.2:可以a[2] = 'p'吗?

不可以,指针a指向的是常量区,常量区的内容只读,不写。

问题2.3:怎么才能实现a[2] = 'p'?

从定义初下手,定义char a[] =?"i love currant",那么a[2] = 'p'合法,操作以后字符串变成了"i pove currant"

再由问题2.3引申问题3:

问题3:char *a = "i love currant"和char a[] =?"i love currant",sizeof(a),结果一样吗?

不一样。这两个申请空间的过程完全不同。

char *a = "i love currant",仅对a来说,系统只给a分配了一个指针大小的空间,即4个bytes,而存"i love currant"的地方在常量区,虽然sizeof(a)=4,但其实总系统消耗量可不止4。

char a[] =?"i love currant",这其实是数组的一种初始化方式,系统不知道这个数组要分配空间到底多大,于是先计算放"i love currant"需要多大,总共14个字符,所以是14bytes,但是别忘了,字符需要一个'\0'在内存里跟别人隔开,中止区分,所以先算出存"i love currant"需要15个bytes,于是给数组a开辟了15个bytes的空间大小,然后将"i love currant"+'\0'放到开辟的空间里。所以这里的sizeof(a) = 15。你以为这就完了?不,a既是变量名,也是首地址,所以还是需要留一个指针的大小,存让a本身存下字符串首指针。

以上就是我自我学习的理解,不一定全对,有问题还请相互指教。

  C++知识库 最新文章
【C++】友元、嵌套类、异常、RTTI、类型转换
通讯录的思路与实现(C语言)
C++PrimerPlus 第七章 函数-C++的编程模块(
Problem C: 算法9-9~9-12:平衡二叉树的基本
MSVC C++ UTF-8编程
C++进阶 多态原理
简单string类c++实现
我的年度总结
【C语言】以深厚地基筑伟岸高楼-基础篇(六
c语言常见错误合集
上一篇文章      下一篇文章      查看所有文章
加:2022-07-04 22:37:15  更:2022-07-04 22:37:56 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/23 16:47:49-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码