16

グローバル変数を初期化してそれ自体を指すことができるかどうかを確認したかったのです。

#include <stdio.h>
struct foo { struct foo *a, *b; } x = { &x, &x };
int main()
{
    printf("&x = %p, x.a = %p, x.b = %p\n", &x, x.a, x.b);
    return 0;
}

このコードは、で期待どおりにコンパイルおよび実行されますgcc(3つのポインターはすべて同じように出力されます)。

私は知りたいです:

  1. これは信頼できますか?
  2. これは標準ですか?
  3. これは持ち運び可能ですか?

編集:明確にするために、私はxそれ自身のイニシャライザーでのアドレスの可用性に疑問を持っています。

4

2 に答える 2

8

上記のすべてに「はい」。同じアドレスで初期化するポインターがいくつかあるので、それらは同じアドレスを保持します。これは、それらを初期化したアドレスと同じです。

おそらくもっと興味深いことに、x.aそれ自体を指すことも保証されています(つまり、構造体の最初の要素は構造体の最初にあることが保証されているため、最初の要素のタイプに変換された構造体へのポインターが保証されますその最初の要素を指すために。

于 2012-05-29T20:45:47.300 に答える
8

これは標準のCコードです。

強力な基準のこの段落はそれを許可しています(私の強調):

(C99、6.2.1p7)「構造体、共用体、および列挙型タグには、タグを宣言する型指定子にタグが出現した直後に開始するスコープがあります。各列挙定数には、定義する列挙型の出現直後に開始するスコープがあります。列挙型リスト内。他の識別子には、宣言子の完了直後に開始するスコープがあります。

詳細については、6.2.1p7の最後の文を説明するために、DerekM.Jonesによる本「TheNewCStandard」があなたと同様の例を使用していることに注意してください。

struct T {struct T *m;} x = /* declarator complete here. */ {&x};
于 2012-05-29T21:07:43.800 に答える