来自ISO / IEC 9899:1999 - > 6.7.8初始化§10
如果没有显式初始化具有自动存储持续时间的对象,则其值为 不定。如果未明确初始化具有静态存储持续时间的对象, 然后:
- 如果它有指针类型,则将其初始化为空指针;
- 如果它有算术类型,则初始化为(正或无符号)零;
- 如果是聚合,则根据这些规则初始化(递归)每个成员;
- 如果是联合,则根据这些初始化(递归)第一个命名成员 规则。
我是否做到了这一点,想象一下这段代码:
int main()
{
static char *szArray[4];
return 0;
}
确保szArray[]
的每个成员都使用NULL
进行初始化?
或者我如何在这种背景下“递归地”理解?
答案 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。指针只是初始化为零。