1

来自 ISO/IEC 9899:1999 -> 6.7.8 初始化 § 10

如果具有自动存储持续时间的对象未显式初始化,则其值是不确定的。如果具有静态存储持续时间的对象未显式初始化,则:

— 如果它具有指针类型,则将其初始化为空指针;

— 如果它具有算术类型,则将其初始化为(正或无符号)零;

— 如果是聚合,则每个成员都根据这些规则(递归地)初始化;

— 如果是联合,则根据这些规则(递归地)初始化第一个命名成员。

我做对了吗,想象一下这段代码:

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

确保每个成员szArray[]都初始化为NULL? 或者在这种情况下我如何理解“递归”?

4

3 回答 3

4

是的。

szArray是一个由 4 个元素组成的数组,每个元素都是一个char*指针。这 4 个元素中的每一个都初始化为 NULL。

这里的“递归”意味着,由于数据类型可以是任意复杂的(数组中的联合中的结构中的数组等),聚合(数组或结构)的每个成员都按照相同的规则进行初始化。

  • szArray是一个聚合,因此“每个成员都根据这些规则(递归地)初始化”。
    • szArray[0]通过szArray[3]都具有指针类型,因此它们中的每一个“都被初始化为空指针”。

这(可能)不涉及任何运行时递归。在大多数系统上,整数0、浮点0.0和空指针都表示为全位为零,因此只需将静态聚合对象设置为全位零即可正确初始化。这是递归的定义;聚合对象的初始化是根据其元素/成员的初始化来定义的,以此类推,直到您了解各个标量。

于 2013-11-08T19:38:53.070 回答
1

的每个成员在使用之前szArray确实被初始化为NULL,一次。总的来说,这个“一次”并没有什么不同,但在其他可能被多次调用的函数中,它很重要这对于线程安全代码和可重入代码尤其重要,因为所有调用都只能访问一个值。

于 2013-11-08T19:42:17.583 回答
1

是的,在这种情况下,您将获得一个包含四个 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 回答