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は、2番目の割り当て(y = ...)によって発生します。アセンブリリストでは、この行に分割がありますか?x=とy=の唯一の違いは、(uintptr_t)へのキャストであることに注意してください。

4

1 に答える 1

8

標準の制約違反による未定義の動作を無視すると、ここで gcc が行うことは、char[0]-&(((struct test*)0)->start)とへの 2 つのポインターの差を計算し、&(((struct test*)0)->end)その差を a のサイズ (char[0]もちろん 0) で割り、除算を取得することです。 0 ずつ。

于 2012-09-25T22:06:21.720 に答える