使用gcc 4.7:
$ gcc --version
gcc (GCC) 4.7.0 20120505 (prerelease)
代码清单(test.c):
#include <stdint.h>
struct test {
int before;
char start[0];
unsigned int v1;
unsigned int v2;
unsigned int v3;
char end[0];
int after;
};
int main(int argc, char **argv)
{
int x, y;
x = ((uintptr_t)(&((struct test*)0)->end)) - ((uintptr_t)(&((struct test*)0)->start));
y = ((&((struct test*)0)->end)) - ((&((struct test*)0)->start));
return x + y;
}
编译和执行
$ gcc -Wall -o test test.c && ./test
Floating point exception
SIGFPE是由第二个赋值语句(y = ...)引起的。在汇编列表中,该行存在除法运算符?请注意,x=和y=之间唯一的区别是强制转换为(uintptr_t)。
char start[0];
意味着你已经超出了标准定义的范围。在那之外发生的事情,真的那么有趣吗? - Daniel Fischer