邪恶八进制信息安全团队技术讨论组's Archiver

stealthwalker 2005-7-1 19:32

[讨论]考大家个小问题 答对了让虎子亲亲你

议题提交:无敌最寂寞 [E.S.T]
信息来源:邪恶八进制信息安全团队

其实这个问题我也是刚搞明白,所以拿出来看看有多少和我一样傻的人:)
答对了我让我小媳妇虎子亲一口

看下面的结构体定义:

#pragma pack(4)
struct A{
int a;
char b;
short c;
char d;
}

请问sizeof(A)的值是多少

该代码在win32系统下的。不要用编译器调试哦,只说出结果是不行的。还需要给出为什么?

ZV 2005-7-1 19:46

光看预编译指令就明白你耍什么花招了。

不说不说,就是不说,虎子的吻,留给楼下的了。

stealthwalker 2005-7-1 19:56

嘿嘿,这也是我犯错误的地方~~~~我也是刚弄明白,估计也有不少兄弟在这里犯迷糊,所以拿出来让大家思考思考。。

kylin 2005-7-1 20:14

我先查查 pack(4)的意思先

haicao 2005-7-2 09:52


..............................
非得打些费话

stealthwalker 2005-7-2 14:39

到底有人知道不说呢还是没人知道?我家虎子的吻是卖不出去了~~哎,回去让她吻ZV算了~~~

冰血封情 2005-7-2 15:37

[quote][b]下面是引用haicao于07-02-2005 09:52发表的:[/b]

..............................
非得打些费话[/quote]
不是4....我已经知道答案了 但是为了避免被dahubaobao性骚扰 就还是不说了
昨天我答错 无敌给我讲的 闹半天 这丫的也是现学的...
无锋还笑话我 强奸的说

sunwear 2005-7-2 22:03

结构体的大小等于最后一个成员的偏移量加上其大小再加上末尾的填充字节数目
sizeof( struct ) = offsetof( last item ) + sizeof( last item ) + sizeof( tr
ailing padding )
但是无敌给出的这段code里有一个影响着sizeof的玩意,也就是pack.
在这里他起着调整结构体对齐方式的作用
#pragma pack( 4 ),4为字节对齐数,默认是8,如果4比结构体成员的sizeof值小,那么该成员的偏移量应该以此值为准,即是说,结构体成员的偏移量应该取二者的最小值。
那么,答案就叫给楼下的了。

忍者5482 2005-7-3 00:36

赞!楼上的大哥说得好详细啊
#pragma pack( 4 )  对这个sizeof(A)没有影响了吧(好像最大的sizeof(int)也只是4,没超过4)
不知道我有没有理解错。。。

4+1+1+2+1=9;
再补齐成sizeof(int)的倍数,9+3=12

if(sizeof(A)==12)  虎子亲亲sunwear;
else  哪位大哥告诉一下正确答案;

dahubaobao 2005-7-3 00:37

一群人渣、流氓!  为了不然流氓们骚扰我,我说说吧。

a的偏移量为0,占用4字节,满足对齐方式;b的偏移量为4,满足对齐方式,占

用1字节;c的偏移量为5,不满足对齐方式,所以+3,占用2字节;d的偏移量

为10,不满足对齐方式,所以+2,占用1字节。最后偏移量为12,结构大小为

12。  

结构实际大小为8字节,可以设置#pragma pack(1)看到实际结构大小。

以上只是个人理解,不对的地方还请提出。

忍者5482 2005-7-3 01:00

汗~~~~~~~~~原来楼上的就是无敌的小媳妇啊,失敬失敬~~~~~~

仔细拜读后发现虽然答案跟你的一样是12,但对齐的过程不一样,等高手来评论一下,看看用
不用被流氓骚扰 ×_×

dahubaobao 2005-7-3 01:24

表瞎说  无敌才是我媳妇  这人渣  正打算休了他!

dahubaobao 2005-7-3 01:25

[quote][b]下面是引用忍者5482于07-03-2005 00:36发表的:[/b]
赞!楼上的大哥说得好详细啊
#pragma pack( 4 )  对这个sizeof(A)没有影响了吧(好像最大的sizeof(int)也只是4,没超过4)
不知道我有没有理解错。。。

4+1+1+2+1=9;
.......[/quote]


4+1+1+2+1=9;  

最后的1哪来的?  结构实际大小是8字节哦!
#pragma pack(1)看看就知道了。

stealthwalker 2005-7-3 03:41

哈哈大家终于参与进来了,偶非常高兴。。。大家的说法很多,那到底谁的对呢?不急,我们再看一个便知是谁的对了:

#pragma pack(4)

struct ttt{
char a;
short b;
char c;
}
那么sizeof(ttt)的值应该是多少呢?回答出来这个,而且能说出为什么的那位的观点就是对了。。。不是我无敌卖关子,我是为了大家,想让大家更深入地了解一下~~~请大家继续参与啊~~~~

我的小媳妇都被你们急得说话都颠三倒四的了,看在我的面子上,千万别让他疯了啊~~~

忍者5482 2005-7-3 09:25

呵呵,既然无敌出来说了,俺就再试试

同样,#pragma pack(4)  对sizeof(ttt)没有影响

sizeof(ttt)=1+1+2+1=5
                a  补 b  c  
最后补成sizeof(short)的倍数,5+1=6

忍者5482 2005-7-3 09:29

[quote][b]下面是引用dahubaobao于07-03-2005 01:25发表的:[/b]



4+1+1+2+1=9;  

.......[/quote]

4+1+1+2+1
a  b  补 c  d
ab加起来为5,但sizeof(short)=2, c 前面补一位

ZV 2005-7-3 11:42

看了大家的回答.有对有错,不过总的理解是对了,而且答案也是对的不少,我看用了编译器的占绝大多数吧,嘿嘿.

#pragma pack(n)是内存对其的意思.

无敌这题有意思是在char和short共存的时候.

大家都知道c会把内存对其,可是内存对其还有一条非常重要的原则,也就是"尽量不浪费内存".

所以这题的正解是:

第一个int4字节,占前4字节.

第二个char,占1字节,第三个short2字节,由于这两个相加还不到4字节,所以他们共用1个4字节的区域.因为考虑到c++对双地址的访问速度较快.所以他们的排列是1011,也就是前两个字节给char用,后两个给short用,而不是1110的排列.这是比较容易看错的地方.

最后一个char占1字节,可是对不齐了,所以它后面要加上3个00的字节填充.所以这个最后的char占了4字节的空间

这样下来,就是12字节了.

c这种不浪费内存又对其的方式在少数变量的时候也许不太好,多数变量的时候还是比较节约的.

比如再来一题:
#pragma pack(8)
struct A{
char c1;  
int i1;   //和char一起占8,不过是10001111的占
float f1;  //不可能和double一起,所以它填充了后面的4字节00
double d1; //占8字节.
} ;
这题的答案是24.是(char4+int4)+(float4+空4)+double8=24

不知道还有谁有其他见解吗?

虎子.......吻就不要了,今晚帮我把无敌..就床正法.

sunwear 2005-7-3 11:44

反正我是没说答案,只是说说了看法而已。
在这看见S8的重量级人物,我眼福不浅啊。

stealthwalker 2005-7-3 11:55

不错,ZV解释的非常正确,其实最通俗的解释如下:
[quote]
#pragma pack规定的对齐长度,实际使用的规则是:
结构,联合,或者类的数据成员,第一个放在偏移为0的地方,以后每个数据成员的对齐,按照#pragma pack指定的数值和这个数据成员自身长度中,比较小的那个进行。
也就是说,当#pragma pack的值等于或超过所有数据成员长度的时候,这个值的大小将不产生任何效果。
而结构整体的对齐,则按照结构体中最大的数据成员 和 #pragma pack指定值 之间,较小的那个进行。
[/quote]
按照这个说法,我上面的那个题可以这样解释:
#pragma pack(4)
  struct tttt
  {
    char a;//第一个成员,放在[0]偏移的位置,
    short b;//第二个成员,自身长2,#pragma pack(4),取2,按2字节对齐,所以放在偏移[2,3]的位置。
    char c;//第三个,自身长为1,放在[4]的位置。
  };
//整个类的大小是5字节,按照min(sizeof(short),4)字节对齐,也就是2字节对齐,结果是6
//所以sizeof(tttt)是6。


ZV,上QQ我有要事找你。。。拜托你了。。。求求你了。。。

sunwear 2005-7-3 11:56

靠  那意思不就跟我说的一样么。

stealthwalker 2005-7-3 12:01

你说的对,但是不够通俗呵呵~~~我又没说你说得不对~~

zv,你要再不上QQ我去跳楼了!

ZV 2005-7-3 12:26

倒,我的才是通俗的说法吧.

我没习惯用QQ了,有事给我发email...qq...占30MB内存啊.

stealthwalker 2005-7-3 12:30

其实和#pragma pack()相对应的还有个__declspec( align() ),前者规定最小,后者规定最大。

PS:ZV,你收到我论坛的消息了吗?我可是在等你写好啊。。。拜托了

sunwear 2005-7-3 21:31

我不说答案的主要原因,其实就是这个答对了的奖品太恐怖了。
所以我就把思路说说,留给那些不要命的。
虎子的吻太可怕了,太恐怖了。
ZV你要倒霉了。

西瓜宝宝 2005-7-16 23:23

不同的系统可能不一样啊,有的说short占2个字节,也有的书说4个字节,我都被弄晕了~

xyzreg 2005-7-17 14:53

[quote][b]下面是引用sunwear于07-03-2005 21:31发表的:[/b]
我不说答案的主要原因,其实就是这个答对了的奖品太恐怖了。
所以我就把思路说说,留给那些不要命的。
虎子的吻太可怕了,太恐怖了。
ZV你要倒霉了。[/quote]
来晚了.其实sunwear说得很对,也很清楚.只不过是谦虚,没有给出个阿拉伯数字,为何?他怕性骚扰啊 [s:39]

代码罐头 2005-7-18 23:16

字节对齐的关系.
#pragma pack(4)

页: [1]
© 1999-2008 EvilOctal Security Team