本帖最后由 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对齐的话。
QQ截图20200724144729.png (1.87 KB, 下载次数: 0)
2020-7-24 14:47 上传
这里的 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内存。