每个静态数组成员都被初始化了吗?

时间:2013-11-08 19:31:12

标签: c c99

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

  

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

     

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

     

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

     

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

     

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

我是否做到了这一点,想象一下这段代码:

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

确保szArray[]的每个成员都使用NULL进行初始化? 或者我如何在这种背景下“递归地”理解?

3 个答案:

答案 0 :(得分:4)

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

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

  • szArray是一个聚合,因此“根据这些规则对每个成员进行初始化(递归)”。
    • szArray[0]szArray[3]都有指针类型,所以每个都“初始化为空指针”。

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

答案 1 :(得分:1)

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

答案 2 :(得分: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。指针只是初始化为零。