2012-01-05 31 views
4

如果struct a a1 = {0};将结构的所有元素(不同类型)初始化为零,那么struct a a2 = {5};应将其初始化为5。否?“struct a a1 = {0};”不同于“struct a a2 = {5};”为什么?

#include <stdio.h> 

typedef struct _a { 
    int i; 
    int j; 
    int k; 
}a; 

int main(void) 
{ 
    a a0; 
    a a1 = {0}; 
    a a2 = {5}; 

    printf("a0.i = %d \n", a0.i); 
    printf("a0.j = %d \n", a0.j); 
    printf("a0.k = %d \n", a0.k); 

    printf("a1.i = %d \n", a1.i); 
    printf("a1.j = %d \n", a1.j); 
    printf("a1.k = %d \n", a1.k); 

    printf("a2.i = %d \n", a2.i); 
    printf("a2.j = %d \n", a2.j); 
    printf("a2.k = %d \n", a2.k); 

    return 0; 
} 

未初始化结构包含无用值

a0.i = 134513937 
a0.j = 134513456 
a0.k = 0 

的初始化为0结构包含初始化为0

a1.i = 0 
a1.j = 0 
a1.k = 0 

的初始化为5结构的所有元素仅包含初始化到第一元件5和其他元素初始化到0

a2.i = 5 
a2.j = 0 
a2.k = 0 

a2.ja2.k始终保证期间a a2 = {5};初始化到0(或)是一个undefined behavior

OTOH,为什么我没有看到初始化5的的s2所有元素。在{0}期间struct初始化如何完成?当使用{5}时,它是如何不同的?

+0

” ......应该对其进行初始化到5 ..没有?!“ 简短回答:第 – hirschhornsalz 2012-01-05 16:03:08

回答

10

参考:

C99标准6.7.8.21

如果在一个大括号内的列表更少初始化比有元件或聚集体的成员,或在一个字符串中更少的字符文字用于初始化一个已知大小的数组,而不是数组中的元素,聚合的其余部分应该隐式地初始化为与具有静态存储持续时间的对象相同。

[编辑]

静态对象和隐式初始化:

对象的存储持续时间确定对象的寿命。
有3周存储的持续时间:所有的块之外声明
静态的,自动的,分配

变量和那些有静态存储类型明确宣布有static storage duration。编译器默认将静态变量初始化为零。

考虑下面的程序:

#include<stdio.h> 

int main() 
{ 
    int i; 
    static int j; 
    printf("i = [%d]",i); 
    printf("j = [%d]",j); 

    return 0; 
} 

在上述程序中,i具有自动存储和,因为它不明确初始化它的值是未定义的
虽然j具有静态存储持续时间和它为保证到被编译器初始化为0

+1

+1为标准的引用。但为了完整性,也许你应该澄清静态对象是如何隐式初始化的。 – 2012-01-05 16:02:42

+0

@OliCharlesworth,这确实很有趣。看起来好像使用'{}'并且永远不允许'未初始化'的结构。 'struct a a3 = {};'这有道理吗? – 2012-01-05 16:04:40

+0

@AaronMcDaid:出于效率原因,C允许未初始化的变量。 – 2012-01-05 16:05:54

8

省略的值将始终初始化为零,因为标准是这样说的。所以,你有本质

struct a a1 = { 0, 0, 0 }; 

struct a a2 = { 5, 0, 0 }; 

这当然是不同的。

2

号在C语言中,如果你的初始化列表是不完整的,所有失踪指数将充满0,所以这样的:

int a[3] = {0}; 
int b[3] = {5}; 

实际上变成:

int a[3] = {0, 0, 0}; 
int b[3] = {5, 0, 0}; 

这就是为什么它似乎与{0}一起使用,但与{5}一起失败。

2

它不工作的

struct x { 
    int *y; 
    /* ... */ 
}; 

struct x xobj = {5}; 
1

以GCC文档中看看Designated Initializers

+0

好的! .. 感谢分享。+1 – 2012-01-05 16:07:30

+0

重要的是要提到它是一个gcc特定的编译器扩展,使用它可以让你的代码在编译器中不可移植。 – 2012-01-05 16:16:50

1

这两种情况下的行为完全相同。如果初始值设定项比聚合中的元素少,则其他元素将被初始化为,就好像它们被声明为static,这意味着它们将被初始化为0或NULL。

这只是在第一种情况下,显式初始化具有相同的值隐含初始化。

如果你想初始化骨料为0以外的东西的所有元素,那么你将不得不为他们每个人提供一个明确的初始化,即:

a a2 = {5, 5, 5}; 
相关问题