4

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

4

1 回答 1

8

忽略由于违反标准中的约束而导致的未定义行为,gcc 在这里所做的是计算两个指向char[0]-&(((struct test*)0)->start)和的指针之间的差异&(((struct test*)0)->end),并将该差异除以 a 的大小,char[0]当然是 0,所以你得到一个除法0。

于 2012-09-25T22:06:21.720 回答