VC驿站

 找回密码
 加入驿站

QQ登录

只需一步,快速开始

搜索
查看: 202|回复: 5

[交流] 结构体指针怎么存储结构体的数据

[复制链接]
44_avatar_middle
最佳答案
0 
在线会员 发表于 2020-7-24 13:57:20 | 显示全部楼层 |阅读模式
struct Student     比如声明了这个结构
{
    string name;
    int num;
    char sex;
    int age;
};

Student YY={"张三", 1001, 'm', 25};      比如再定义了这个结构

struct  *p=   &YY;         把结构体YY的地址赋给P

p这个地址里存着YY这个结构体,那么问题来了假设p的地址是0x00000000   那么“张三”两个每个字占一个字节,1001整形占两个个字节,m是char型占一个字节,25整型占两个个字节,那么内存分配是不是这样

0x00000000     张
0x00000001     三
0x00000002     1001
0x00000003     0000
0x00000004     m
0x00000005     25
0x00000006     0000


没数据的我就用0000代替了

我理解的对吗   




上一篇:学习问题
下一篇:求助关于命名空间的问题
08_avatar_middle
最佳答案
3 
在线会员 发表于 2020-7-24 14:40:17 | 显示全部楼层
本帖最后由 SummerGull 于 2020-7-24 15:01 编辑

这么理解怎么可能对呢。struct的设计思想是 要 “更快 更方便的检索到数据” 所以他放弃了 内存的紧凑性质。
结构体内存对齐。
https://www.cnblogs.com/gaoxiaoniu/p/10675927.html
=============================
还有 你写的这个

0x00000000     张
0x00000001     三
0x00000002     1001
0x00000003     0000
0x00000004     m
0x00000005     25
0x00000006     0000
一个字符占用一个 格子没错。 但是 int是 4个格子的,。
应该是
0x00000000     张
0x00000001     三
0x00000002     1001
0x00000006     m
0x00000007     25
0x00000011     0000


比如 结构体存在 三个数据
struct a
{
        short a;
        int b;
        double c;
};

那么他的sizeof 会是多少呢?
2+4+8=14;
实际大小 我 目测觉得 应该是 2+2+4+4+4 = 16
内存布局是这样的。默认4对齐的话。

结构体指针怎么存储结构体的数据

这里的 a变量是 short 2字节。 那么 它一定要凑足4个字节之后 才能为 下一个变量 int b 为开头地址。 凑不足 直接空出来。
如果是 字符串的话 1个或2个, 和 a 变量凑满 4个字节即可。
0x00000000     a
0x00000002     'a'
0x00000003     'b'
0~3为四个字节 对齐了。

如果 字符串大于 3个。那么   a变量 2个字节 +3个字节的 字符串。 结果是 超出了 4个字节的宽度。 那么 下一行 就单独 为 字符串末尾开辟一个 空间大小为 4个字节的 地址 专门储存。多了的就空出来(因为 下一个变量 int 是占 4个字节的。 剩余3个字节无法容纳 如果是 short 就可以容纳了。并且是 对齐后储存的。 )
0x00000000     a
0x00000002     'a'
0x00000003     'b'
0~3为四个字节 对齐了。
这里多了个 字符 c 地址为4

0x00000004     'c'
0x00000005        空出来
0x00000006        空出来
0x00000007        空出来

如果 还有一个 short变量 的话 那么 排列是这样的
0x00000004     'c'
0x00000005        空出来
0x00000006        新的short x
0x00000007        新的short x

6~7是 新的short变量  x内存。

08_avatar_middle
最佳答案
3 
在线会员 发表于 2020-7-24 15:29:58 | 显示全部楼层
a86116403 发表于 2020-7-24 15:25
谁真的不明白,一会是4字节一段,一会是1字节一段,有没有对齐原则

https://www.cnblogs.com/gaoxiaoniu/p/10675927.html
看看文章 比较清楚。
VC环境默认是 4个字节对齐。简单说 double 是8个字节。就分成两段 4字节来看待。
short是2字节。  看成4字节对齐 就在后面填充 空的 2字节,。
一个字符 是1个字节。 看成4字节对齐 就在后面填充3个空的字节。
但是 后面 空出了 3个字节。short是2个字节的。完全可以容纳。那么就容纳 进去了。int容纳不了。那么就 换一行开始。
08_avatar_middle
最佳答案
3 
在线会员 发表于 2020-7-24 15:35:03 | 显示全部楼层
本帖最后由 SummerGull 于 2020-7-24 15:39 编辑
a86116403 发表于 2020-7-24 15:25
谁真的不明白,一会是4字节一段,一会是1字节一段,有没有对齐原则


对齐原则 简单来概括就是
----该空就空。该容纳就得容纳。
结构体内有  int short  char  三个变量为 a b c
那么 按照4字节对齐。
a对齐了
b对齐的话 还需要空出两个字节。后面有个变量 c 正好为一个字节。 空的两字节完全可以容纳下来。
这里的 大小为 :
4+2+1  ==  4+ 4 = 总共大小 8 字节       
======第一个4 是 int的字节大小,2 表示为 short的字节,1 表示 char的字节。

又比如 结构体内有  char int short  三个变量为 a b c
char 对齐四字节。那么 空出 三个[char 是一个字节] 他后面的变量 为 int 四个字节。 无法容纳进去。
int 只能在 新的一行 开始 (也就是 char 1个字节 + 3字节 后面开始)。这里的int对齐了。
short 两个字节。对齐四字节 后面 填充2字节空白。但是后面没有变量了。 结束,。
这里的大小为 :
4+4+4= 总共大小 12 字节;
======第一个4 代表 char 补齐 四字节,第二个 4 代表 int,因为int需要4个字节。char剩下的3个字节 无法满足 开辟新的一行。最后一个 4 代表  short 为2字节。但是 为了对齐,。补足两个字节。

得出结论 顺序 也是很重要的。
44_avatar_middle
最佳答案
0 
ico_lz  楼主| 发表于 2020-7-24 15:25:39 来自手机 | 显示全部楼层
SummerGull 发表于 2020-7-24 14:40
这么理解怎么可能对呢。struct的设计思想是 要 “更快 更方便的检索到数据” 所以他放弃了 内存的紧凑性质 ...

谁真的不明白,一会是4字节一段,一会是1字节一段,有没有对齐原则

点评

如果 觉得难以理解。百度了很多文章还是不懂。建议跳过。 并不是很重要的内容  发表于 2020-7-24 15:43
您需要登录后才可以回帖 登录 | 加入驿站 qq_login

本版积分规则

×【发帖 友情提示】
1、请回复有意义的内容,请勿恶意灌水;
2、纯数字、字母、表情等无意义的内容系统将自动删除;
3、若正常回复后帖子被自动删除,为系统误删的情况,请重新回复其他正常内容或等待管理员审核通过后会自动发布;
4、感谢您对VC驿站一如既往的支持,谢谢合作!

关闭

站长提醒上一条 /2 下一条

QQ|小黑屋|手机版|VC驿站 ( 辽ICP备09019393号 )|网站地图wx_jqr

GMT+8, 2020-9-25 21:46

Powered by CcTry.CoM

© 2009-2020 cctry.com

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