2 piaoxue20161998 piaoxue20161998 于 2016.03.24 19:05 提问

C语言 数据结构内存布局问题

struct A
{
char e;
short f;
};

struct B
{
int a;
char b;
struct A c;
char d;

};

sizeof(struct B); 为什么是12?

struct A
{
char e;
int f;
};

struct B
{
int a;
char b;
struct A c;
char d;

};

sizeof(struct B);为什么是20?

求大牛解释解释 在线等。

6个回答

u011553604
u011553604   2016.03.24 19:15
piaoxue20161998
piaoxue20161998 看了,我就是不明白第一种为什么是 12,求大牛讲讲
2 年多之前 回复
qq423399099
qq423399099   Ds   Rxr 2016.03.24 20:31

第一个是有点奇怪
struct B
{
int a;
char b;
struct A c;
char d;
};
1.什么都不去掉是12
2.只去掉char b;也是12
3.只去掉char d;也是12
4.去掉char b和char d,是8

ankangyanghushi
ankangyanghushi 因为struct A c被展开了
2 年多之前 回复
qq_24262913
qq_24262913   2016.03.25 00:19

结构体里嵌套结构体,对齐的计算原则应该是将里面的结构体展开来计算

qq_24262913
qq_24262913 c语言里的自然对齐规则是位宽能够被所在地址整除,但还要考虑整个结构能够对齐,所以char也是占4个字节,计算结果是20
2 年多之前 回复
piaoxue20161998
piaoxue20161998 那把第二个B展开和直接计算 占用空间大小不一样
2 年多之前 回复
ankangyanghushi
ankangyanghushi   2016.03.27 17:55

内存结构分布是这样的(按VS/VC默认8字节对齐):
<-4字节宽度->
|a a a a|
|b e f f|
|d 0 0 0|

4字节宽度是根据sizeof(int)(所有属性中size最大)和8字节中取较小的,另外总的size必须是sizeof(int)的整数倍,不够填充0。
建议你可以找下相关知识充分理解一下。

ankangyanghushi
ankangyanghushi   2016.03.27 17:59

struct A
{
char e;
int f;
};
struct B
{
int a;
char b;
struct A c;
char d;
};
sizeof(struct B);为什么是20?

<-4字节宽度->
|a a a a|
|b e 0 0|
|c c c c|
|d 0 0 0|

ankangyanghushi
ankangyanghushi struct 的首地址要被结构内部的最大sizeof类型整除。
2 年多之前 回复
ankangyanghushi
ankangyanghushi struct虽然是展开的,但是是另起一行,即e的地址要被4整除
2 年多之前 回复
piaoxue20161998
piaoxue20161998 这样就是16啊 sizeof 测的20
2 年多之前 回复
CSDNXIAOD
CSDNXIAOD   2016.03.30 11:22

c语言中内存布局问题
关于C语言中数据结构的内存对齐问题
----------------------biu~biu~biu~~~在下问答机器人小D,这是我依靠自己的聪明才智给出的答案,如果不正确,你来咬我啊!

Csdn user default icon
上传中...
上传图片
插入图片
准确详细的回答,更有利于被提问者采纳,从而获得C币。复制、灌水、广告等回答会被删除,是时候展现真正的技术了!
其他相关推荐
C语言内存模型及运行时内存布局
BSS段(bss segment) 通常是指用来存放程序中未初始化的全局变量的一块内存区域。BSS是英文Block Started by Symbol的简称。BSS段属于静态内存分配。 数据段(data segment) 通常是指用来存放程序中 已初始化 的 全局变量 的一块内存区域。数据段属于静态内存分配。  代码段(code segment/te
C程序的内存布局(Memory Layout)
C语言程序的内存布局 C语言程序的内存布局结构,包括连接过程中目标程序各个段的组成和运行过程中各个段加载的情况。 C语言程序在内存中各个段的组成 C语言程序连接过程中的特性和常见错误 C语言程序的运行方式 C语言程序的存储区域         由C语言代码(文本文件)形成可执行程序(二进制文件),需要经过编译-汇编-链接三个阶段。编译过程把C语言文本文件生成汇编程序,汇编过程把汇编
数据结构(C语言版)中,舞伴问题
数据结构(C语言版)中,队列的应用问题,用两个循环队列实现舞伴问题。
数据结构:各类迷宫问题详解(c语言版)
第一类 简单迷宫(不含多条出路,不带环)(0代表墙,1代表通路) 思路分析: 1.以入口为起点,寻找出口(除了起点以外的边缘上的点) 2.判定当前点坐标是否可以走。(坐标合法且不为0) 3.如果合法则将当前点标记成走过的并入栈(维护一个栈可以记录走过的路径,栈的长度就是路径的长度) 4.判断当前点是否是出口,是出口就return(该迷宫不存在别的出口),如果不是出口,...
数据结构(C语言版)迷宫求解问题
初学数据结构和C语言,尝试实现了迷宫求解问题。代码组织比较差,改进的地方也有很多,博君一乐而已。希望能够帮助到别人
数据结构的迷宫问题 C语言
数据结构(C语言版)经典问题 绝对经典 不信你下了看看
循环队列的应用——舞伴配对问题(数据结构 C语言)
循环队列的应用——舞伴配对问题:      在舞会上,男、女各自排成一队。舞会开始时,依次从男队和女队的队头各出一人配成舞伴。如果两队初始人数不等,则较长的那一队中未配对者等待下一轮舞曲。假设初始男、女人数及性别已经固定,舞会的轮数从键盘输入。试模拟解决上述舞伴配对问题。要求:从屏幕输出每一轮舞伴配对名单,如果在该轮有未配对的,能够从屏幕显示下一轮第一个出场的未配对者的姓名。   #代码实现
数据结构(C语言版)”栈与队列“章节迷宫求解问题的思路与实现
迷宫求解问题来源自”数据结构(C语言版)“一书第50页的例题。该例题要求在不使用递归(因为暂时还没讲到),只能通过使用诸如入栈出栈的方式获取一条可以走出迷宫的路径。     在看完文字提示后,我就没有看后面的伪代码实现了(对于我来说,本书的所有伪代码的组织就像一团乱麻,反而更加没有头绪)。在理解文字说明的基础上我试图通过独立思考解决,以下就是我的思考过程。 1.迷宫求解问题的规则有哪些?
【数据结构】递归求解迷宫问题
数据结构 递归求解迷宫问题 参考代码如下: /* 名称:递归求解迷宫问题 编译环境:VC++ 6.0 日期: 2014年4月1日 */ #include #include // 迷宫坐标位置类型 struct PosType { int x; // 行值 int y; // 列值 }; #define MAXLENGTH 25 // 设迷宫的最大行列为25 typedef
数据结构-------列车重排-----队列的应用
一、问题说明        一列货运列车共有n节车厢,每节车厢将停放在不同的车站。假定n个车站的编号分别为1~n,货运列车按照第n站至第1站的顺序经过这些车站。车厢编号与他们的目的地一样。为了便于从列车上卸掉相应的车厢,必须重排车厢顺序,使得各车厢从前往后按编号1到n的次序排列。当所有车厢按照这种次序排列时,在每个车站只需卸掉最后一个车厢即可。