鱼C论坛

 找回密码
 立即注册
查看: 2286|回复: 8

[技术交流] 看图说话来讨论char内存的问题

[复制链接]
发表于 2022-9-20 18:05:04 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
本帖最后由 howzyao 于 2022-9-20 18:06 编辑

sshot-1.png

如上图,
1, 指针地址,指针固定是4字节,是单独的空间;

2, abcefg 是右值,首地址是31

3, 可以数出 31地址占用内存的长度,是6个字符+1个''\0'' 共7个char长度

4, 指向 首地址 *p =='a'

5, 让指针指向这个31地址,无论31多长,也是没有问题;

6, 31地址 +1字节 到了32地址 为什么32地址 能储存字符b?

疑问是6:
红线处32地址中的字符b,为什么能被 p[1]访问?
那没有p[2] 字符c是否能被p访问?

另:
大家截图中发现%c 格式 访问p时,出现的不是地址,而是"偏移量1"没有?这个机制怎么讲?
望知道的坛友能跟贴教学,谢谢.
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2022-9-20 18:09:24 | 显示全部楼层
sshot-2.png
看来还是可以的.
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2022-9-20 18:22:15 | 显示全部楼层
本帖最后由 howzyao 于 2022-9-20 18:23 编辑

最后,通过本节的分析,得到剖析图: 其中有没有错误的地方,对不对,欢迎大家指出来.为谢.

sshot-4.png
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-9-20 18:22:38 | 显示全部楼层
本帖最后由 jackz007 于 2022-9-20 18:24 编辑

       地址 31 可以储存 'a' ,那么,32 为何不可以储存 'b' ? p 是 char * 其步进单位是 1 个 char,* p 或者 p[0] 是 'a',* (p + 1) 或者 p[1] 当然就是 'b' 了,这还能有什么疑问?同样的道理,* (p + 2) 或者 p[2] 毫无疑问就是 'c' 了。

       %c 是按字符显示,意思是,把整型数作为 ASCII 编码,显示其对应的 ASCII 字符,%d 是按十进制显示,意思是按十进制显示整型数,%p 是把整型数显示为十六进制数。%s 比较特殊,是把整型数作为内存地址,从前往后逐个按字符(%c)显示内存中的数字,直到遇到字符串结束标志字符 '\0'。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2022-9-20 18:26:47 | 显示全部楼层
jackz007 发表于 2022-9-20 18:22
地址 31 可以储存 'a' ,那么,32 为何不可以储存 'b' ? p 是 char * 其步进单位是 1 个 char,* p  ...
p 是 char * p 步进单位是 1 个 char


这时,是不是就可以理解为之前 声明的&p的地址和长度,这个空间,就与31这里无关了?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-9-20 18:36:35 | 显示全部楼层
本帖最后由 jackz007 于 2022-9-20 18:38 编辑
howzyao 发表于 2022-9-20 18:26
这时,是不是就可以理解为之前 声明的&p的地址和长度,这个空间,就与31这里无关了?


         完全听不懂你在说什么,什么就"与 31 无关了"
         你通过 new 分配到的 2 字符的存储空间从 31 开始,而 p 的数值就是这个 31,这算不算有关系?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2022-9-20 18:52:42 | 显示全部楼层
jackz007 发表于 2022-9-20 18:36
完全听不懂你在说什么,什么就"与 31 无关了"
         你通过 new 分配到的 2 字符的存储空 ...
通过 new 分配到的 2 字符的存储空间从 31 开始

怪我没有标出来,第一行,FF1C的这个地址,是存放p的地址,那么p现在的空间,是不是从
FF1C -> FF1D 2个字节,p此时是 首地址,我开始,是这样理解的,我再用memcpy对这2个字节的空间复制的实验一下看看是不是这样.
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-9-20 18:59:32 | 显示全部楼层
本帖最后由 jackz007 于 2022-9-20 19:09 编辑

       你要搞清楚的是,p 是一个指针,存放 p 和存放 int、float 都一样,需要 4 个字节的空间,它和你申请的 2 个字符的字符串空间没有关系,只不过 p 的数值正好是字符串空间的开头地址,p 是变量,可以被任意改变,这一点和 char s[] = 'abcdefg' 中的 s 有所不同,s 是常量指针,其数值和字符串的存储空间地址是绑定的,并且,在代码被编译的时候就已经被确定,所以,s 的值是不可更改的,但是 s 和 p 的用法却是完全一样的,把 p 指向 s 后,p 就是 s,p[1] 就是 s[1]。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2022-9-20 19:09:01 | 显示全部楼层
本帖最后由 howzyao 于 2022-9-20 19:12 编辑
jackz007 发表于 2022-9-20 18:36
完全听不懂你在说什么,什么就"与 31 无关了"
         你通过 new 分配到的 2 字符的存储空 ...

完全听不懂你在说什么


sshot-5.png

我这是这个意思.
我是说,p[0] == p 的 解除引用地址操作(*p) :代表了地址是实际的.
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-11-16 22:47

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表