关于C语言结构体对齐的困惑

litolyan 2008-12-07 09:00:03
近来为了弄明白C语言中的结构体对齐,利用VC6.0调试一个小程序的时候,有些困惑,恳请大家帮忙看看,谢谢了
具体代码如下:

#include "stdafx.h"
#include <stdio.h>
#include <stdlib.h>

struct MINE {
char cc;
short ss;
//int ii;
float ff;
double dd;
};

int main(void) {

printf("%d\n",sizeof(struct MINE));
return 1;
}

运行结果是16;
当把MINE结构体中的int ii前的注释去掉之后,运行结果却是24,这是怎么回事呢?怎么会突然增加了8个字节呢?
第一次发帖,只给6分,希望大家不要介意啊
...全文
129 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
sciencesuneast 2009-06-13
  • 打赏
  • 举报
回复
哈哈..学习了...

不过在tc3.0下面好像就没有这些东西...
sciencesuneast 2009-06-13
  • 打赏
  • 举报
回复
哈哈..学习了...

不过在tc3.0下面好像就没有这些东西...
blackboycpp 2008-12-08
  • 打赏
  • 举报
回复
平台实现的不同吧. gint8, guint8, gint16, guint16, gint32, guint32, gint64, guint64这些类型多好, 只可以跨平台...
char, int, float, double这些就不行了............
litolyan 2008-12-07
  • 打赏
  • 举报
回复
哦,谢谢hairetz 、e_sharp 和majun01 三位,但是我刚才在Ubuntu下面的Eclipse下用GCC调试的时候得到的结果分别是16和20,这又怎么解释呢?这是因为两种编译器采用不同的方法实现还是因为什么呢?哪一个才是标准的呢?
当然老去问这种问题是不是有点可笑啊,呵呵,希望大家不要笑我啊,谢谢了
rejoice914 2008-12-07
  • 打赏
  • 举报
回复
google
字节对齐
majun01 2008-12-07
  • 打赏
  • 举报
回复
short是二字节对齐,int和float是四字节对齐,double是八字节对齐,
即:short的起始地址是二的倍数,int和float是四的倍数,double是八的倍数,
按这样的解释,你应该知道为什么16扩大了8个字节
当没有int时:char占一个字节,后面还要加一个空白字节,为了使short的起始地址是二的倍数,
其后紧跟float四个字节,和double的八个字节,总共:16个字节

有了int时,char占一个字节,后面还要加一个空白字节,为了使short的起始地址是二的倍数,
其后紧跟int的四个字节和float四个字节,——然后再加四个空白字节,为了使double的起始
地址是8的倍数。这样一算,总共是不是:24,哈哈。
e_sharp 2008-12-07
  • 打赏
  • 举报
回复
struct MINE { 
char cc;
short ss;
//int ii;
float ff; //没有ii,前面大小是4,float大小是4,对齐
double dd; //前面大小是8,double是8,对齐,所以MINE大小是16
};

struct MINE {
char cc;
short ss;
int ii;
float ff; //前面大小是8,float大小是4,对齐
double dd; //前面大小是12,double是8,不对齐,前面必须8的倍数,所以补4个字节,这时MINE大小是24
};
  • 打赏
  • 举报
回复
而之前是
char cc; [0]
short ss; [2],[3]
float ff; [4],[5],[6],[7]
double dd; [8],[9],[10],[11] ....[16]
所以是16字节咯
  • 打赏
  • 举报
回复
找了下原因,double型要按8字节地址对齐。
char cc; [0]
short ss; [2],[3]
int ii; [4],[5],[6],[7]
float ff; [8],[9],[10],[11]
到了double dd;
它不能从[12]开始,只能从[16]开始,所以结果就是24咯。。。
  • 打赏
  • 举报
回复
费解。。

69,336

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧