2012-01-05 32 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}; 
相關問題