- 论坛徽章:
- 17
|
本帖最后由 asuka2001 于 2011-09-29 14:54 编辑
稍微有些好奇gcc的实际行为,以前只是认为直接offsetof就是把offset的编译常量返回了,所以反编译了程序看看
08048494 <main>:
8048494: 55 push %ebp
8048495: 89 e5 mov %esp,%ebp
8048497: 83 e4 f0 and $0xfffffff0,%esp
804849a: 83 ec 10 sub $0x10,%esp
804849d: b8 00 00 00 00 mov $0x0,%eax
80484a2: 83 c0 06 add $0x6,%eax
80484a5: 89 44 24 04 mov %eax,0x4(%esp)
80484a9: c7 04 24 80 85 04 08 movl $0x8048580,(%esp)
80484b0: e8 0b ff ff ff call 80483c0 <printf@plt>
80484b5: b8 00 00 00 00 mov $0x0,%eax
80484ba: c9 leave
80484bb: c3 ret
从汇编上看,offset gcc是直接获得的6,然后把它和基址0相加。由于不需要解引用指针,所以没有引起段错误。。。
就这点上看,还真可以说offset虽然是编译常量,但是offsetof宏其实还是在运行期返回的值,所以我刚才的说法是错误的!
之所以没有出现段错误,仅仅是因为并不需要解引用null指针! |
|