wwwheihei 发表于 2015-9-22 16:06:46

结构体占大小

有人懂吗

康小泡 发表于 2015-9-22 17:19:28

8一个long 占4个字节,char占1个字节。因为是按8个字节来算,所以对齐后事8
7 因为里面的结构体占8个字节 Long long 类型也占8个字节,而且没有规定是按照什么对齐,所以这里char型需要用7个字节来填补自己满足8字节

ianv 发表于 2015-9-22 17:30:05

康小泡 发表于 2015-9-22 17:19
8一个long 占4个字节,char占1个字节。因为是按8个字节来算,所以对齐后事8
7 因为里面的结构体占8个字 ...

按照最大的那个对齐吧?

康小泡 发表于 2015-9-22 17:56:41

ianv 发表于 2015-9-22 17:30
按照最大的那个对齐吧?
是啊,不过是在没有在程序中指明按多少字节对齐的情况下。然后因为这里楼主的代码中有一个#program pack(8) 所以这里以8个字节对齐

ianv 发表于 2015-9-22 18:48:10

康小泡 发表于 2015-9-22 17:56
是啊,不过是在没有在程序中指明按多少字节对齐的情况下。然后因为这里楼主的代码中有一个#program pack( ...

这样啊。学习了。以前都没有自己定义过对其大小

wwwheihei 发表于 2015-9-23 08:43:07

康小泡 发表于 2015-9-22 17:56
是啊,不过是在没有在程序中指明按多少字节对齐的情况下。然后因为这里楼主的代码中有一个#program pack( ...

#pragma pack(8)

#pragma pack()
是一对,也就是说中间的都是8字节对齐 ,是这样吗

wwwheihei 发表于 2015-9-23 08:47:35

康小泡 发表于 2015-9-22 17:19
8一个long 占4个字节,char占1个字节。因为是按8个字节来算,所以对齐后事8
7 因为里面的结构体占8个字 ...

答案是这个

康小泡 发表于 2015-9-23 09:47:25

wwwheihei 发表于 2015-9-23 08:47
答案是这个

谢谢,我懂了。
第二个问题我理解错了。
第二个问题里面char的下一个类型是char ,char型接下来是int型,所以他们先是按照int型的来对齐,int型占4个字节。 对齐后就成了1*** 1*** 1111 然后因为接下来是long long 型,long long 型所占字节为8个字节,所以前面的需要以8字节来对齐   所以就变成(1*** 1***)(1111 1111) (1111 1111)


开始我并不知道的一个点是是先根据与自己临近的最大的来对齐。长知识了。

wwwheihei 发表于 2015-9-23 10:13:30

康小泡 发表于 2015-9-23 09:47
谢谢,我懂了。
第二个问题我理解错了。
第二个问题里面char的下一个类型是char ,char型接下来是in ...

那你还是和答案不一样啊?而且人家那里有int型的变量?

wwwheihei 发表于 2015-9-23 10:31:03

本帖最后由 wwwheihei 于 2015-9-23 10:36 编辑

wwwheihei 发表于 2015-9-23 10:13
那你还是和答案不一样啊?而且人家那里有int型的变量?

你的理解是不对的,我现在理解了,如果不申明按多少字节对齐,他们是按照自身的类型大小来对齐的,也就是说放到类型大小的边界上,并不是按照类型中最大的来对齐,除非是结构体内嵌,就像我的题目那样,如果你不信你做这个题目:
struct node{

char a;
char b;

shortc;

intd;



};
用你的方法计算他占的字节数??????

康小泡 发表于 2015-9-23 11:09:42

wwwheihei 发表于 2015-9-23 10:31
你的理解是不对的,我现在理解了,如果不申明按多少字节对齐,他们是按照自身的类型大小来对齐的,也就 ...

8

wwwheihei 发表于 2015-9-23 12:12:46

本帖最后由 wwwheihei 于 2015-9-23 13:20 编辑

康小泡 发表于 2015-9-23 11:09
8

哦对的
页: [1]
查看完整版本: 结构体占大小