1

ISO/IEC 9899:1999 より -> 6.7.8 初期化 § 10

自動保存期間を持つオブジェクトが明示的に初期化されていない場合、その値は不確定です。静的ストレージ期間を持つオブジェクトが明示的に初期化されていない場合:

— ポインター型の場合、null ポインターに初期化されます。

— 算術型の場合、(正または符号なし) ゼロに初期化されます。

— 集合体の場合、すべてのメンバーはこれらの規則に従って (再帰的に) 初期化されます。

— 共用体の場合、最初の名前付きメンバーは、これらの規則に従って (再帰的に) 初期化されます。

このコードを想像してください。

int main()
{
    static char *szArray[4];
    return 0;
}

の各メンバーが?szArray[]で初期化されることが保証されます。NULLまたは、このコンテキストで「再帰的に」理解するにはどうすればよいですか?

4

3 に答える 3

4

はい。

szArraychar*それぞれがポインタである 4 つの要素の配列です。これらの 4 つの要素はそれぞれ NULL に初期化されます。

ここで「再帰的に」とは、データ型が任意に複雑になる可能性があるため (配列内の共用体内の構造内の配列など)、集合体 (配列または構造体) の各メンバーが同じ規則に従って初期化されることを意味します。

  • szArrayは集約であるため、「すべてのメンバーはこれらのルールに従って (再帰的に) 初期化されます」。
    • szArray[0]すべてにszArray[3]ポインター型があるため、それぞれが「ヌルポインターに初期化されます」。

これには (おそらく) 実行時の再帰は含まれません。ほとんどのシステムでは、integer 0、floating-point 0.0、および null ポインターはすべて全ビット ゼロとして表されるため、静的集合体オブジェクトはおそらく全ビット ゼロに設定するだけで正しく初期化できます。再帰的な定義です。集約オブジェクトの初期化は、その要素/メンバーの初期化の観点から定義され、個々のスカラーに到達するまで再帰的に定義されます。

于 2013-11-08T19:38:53.070 に答える
1

の各メンバーは、使用される前に一度だけszArray初期化されます。に、この「一度」は違いはありませんが、何度も呼び出される可能性のある他の関数では重要です。すべての呼び出しでアクセスされる値は 1 つだけであるため、スレッド セーフ コードと再入可能コードでは特に重要です。NULL

于 2013-11-08T19:42:17.583 に答える
1

はい、この場合、4 つの NULL 値の配列を取得します。

仕様の「再帰的」はポインターには適用されません。構造体に適用されます。たとえば。

#include <stdio.h>

struct Bar {
  int yada;
};

struct Foo {
  struct Bar bar;
  const char* baz;
};

static struct Foo foo;
static struct Foo* foo_ptr;

int main()
{

  printf("foo.bar.yada = %d\n", foo.bar.yada);
  printf("foo_ptr = %p\n", foo_ptr);

  return 0;
}

上記を実行すると、

foo.bar.yada = 0
foo_ptr = (nil)

初期化規則は Foo に再帰的に適用され、次に Bar に適用されます。ポインターはゼロに初期化されるだけです。

于 2013-11-08T19:45:26.990 に答える