使用 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)。