作者:咖啡的因_411 | 来源:互联网 | 2023-09-06 06:44
近来为了弄明白C语言中的结构体对齐,利用VC6.0调试一个小程序的时候,有些困惑,恳请大家帮忙看看,谢谢了具体代码如下:#includestdafx.h#include<
近来为了弄明白C语言中的结构体对齐,利用VC6.0调试一个小程序的时候,有些困惑,恳请大家帮忙看看,谢谢了
具体代码如下:
#include "stdafx.h"
#include
#include
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分,希望大家不要介意啊
10 个解决方案
找了下原因,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咯。。。
而之前是
char cc; [0]
short ss; [2],[3]
float ff; [4],[5],[6],[7]
double dd; [8],[9],[10],[11] ....[16]
所以是16字节咯
哦,谢谢hairetz 、e_sharp 和majun01 三位,但是我刚才在Ubuntu下面的Eclipse下用GCC调试的时候得到的结果分别是16和20,这又怎么解释呢?这是因为两种编译器采用不同的方法实现还是因为什么呢?哪一个才是标准的呢?
当然老去问这种问题是不是有点可笑啊,呵呵,希望大家不要笑我啊,谢谢了
平台实现的不同吧. gint8, guint8, gint16, guint16, gint32, guint32, gint64, guint64这些类型多好, 只可以跨平台...
char, int, float, double这些就不行了............
哈哈..学习了...
不过在tc3.0下面好像就没有这些东西...
哈哈..学习了...
不过在tc3.0下面好像就没有这些东西...