2017-08-21 48 views
2

我有一個結構包含兩個相同類型的其他結構,我想初始化它有兩個NULL開始。我怎麼做?我已經嘗試了下面,但使用gcc獲取編譯器警告。如何初始化一個結構爲null?

#include <stdio.h> 

typedef struct Segment { 
    int microseconds; 
} Segment; 

typedef struct Pair { 
    Segment mark; 
    Segment space; 
} Pair; 

int main() 
{ 
    Pair mark_and_space = { .mark = NULL, .space = NULL }; 

    return 0; 
} 

而編譯器警告:

main.c:14:5: warning: initialization makes integer from pointer without a cast [enabled by default]             
Pair mark_and_space = { NULL, NULL };                           
^                                     
main.c:14:5: warning: (near initialization for 'mark_and_space.mark.microseconds') [enabled by default]            

main.c:14:5: warning: initialization makes integer from pointer without a cast [enabled by default]             
main.c:14:5: warning: (near initialization for 'mark_and_space.space.microseconds') [enabled by default] 
+2

變空爲0,因爲標記和空間類型爲int你是在讀 – Ihdina

回答

2

爲了intialise兩個子結構,每個包含單個int成員最接近NULL什麼變,即初始化所有整數爲「0」,您可以使用此代碼:

#include <stdio.h> 

typedef struct Segment { 
    int microseconds; 
} Segment; 

typedef struct Pair { 
    Segment mark; 
    Segment space; 
} Pair; 

int main(void) 
{ 
    Pair mark_and_space = { {0}, {0} }; 

    return 0; 
} 

如果您想要將它們初始化爲NULL,假設你想到了指針,這是唯一可以完全初始化爲NULL的指針,然後看到其他答案,基本上說「如果你想初始化指針值,然後初始化指針,不是整數「。

0

你得到這些錯誤,因爲NULL是一個指針。您不能指定一個指向Segment的指針。解決這個問題的方法是改爲將Segment對改爲Segment *。但是,您將負責內存分配。

2

你不行。 NULL是一個指針,其值設置爲零,但您的markspace屬性不是指針值。在您的代碼中,它們都是值類型,作爲您的Pair結構的一部分進行分配。

將變量更改爲Segment *而不是Segment,您將能夠將它們設置爲NULL。

0

由於Pair字段不是指針,NULL不是初始化結構的好選擇。但是如果你想只是場設置爲零,你可以嘗試使用更多的括號:

Pair mark_and_space = { .mark = {3}, .space = {0} }; 

此行我的MinGW編譯遵守沒有任何警告。我將mark.milliseconds設置爲3,例如如何將任意初始值設置爲內部毫秒字段。

0

您無法將結構初始化爲空。不過,您可以將指針的結構初始化爲空。每POSIX standard(重點煤礦):

NULL

空指針常量。 [CX]⌦宏將擴展爲整數常量表達式,其中值爲0,類型爲void *

注意,類型,以及它爲什麼你的定義不兼容。您可以成員更改爲Segment *(和malloc您的堆棧變量自己),也可以靜態初始化它們:

Pair mark_and_space = { { }, { } }; 
/* v---------------------^ ^
    default to 0, but you can choose different value(s) */ 
+0

哪個標準? C11標準,ISO/IEC 9899:2011§7.19**通用定義' **說:_¶3宏是: 'NULL' 擴展爲實現定義的空指針常量; ... _。這不符合你的報價。 C90和C99都沒有說明你聲稱的是什麼;都說C11說什麼。你的空括號符號在C中也是無效的 - 但是在C++中。你在C問題中引用了C++標準嗎? –

+1

噢,好的 - 你在引用POSIX標準,並且錯過了顯示規則是C標準擴展的標記。我已經添加了這些標記,並且規定您引用的是POSIX標準,而不是C標準,並且突然您的引號是乾淨的。在標準C中,空括號初始化器仍然無效。 –

0
#include <stdio.h> 

typedef struct Segment { 
    int microseconds; 
} Segment; 

typedef struct Pair { 
    Segment mark; 
    Segment space; 
} Pair; 

int main() 
{ 
    Pair mark_and_space = { .mark.microseconds = (int) NULL, 
          .space.microseconds =(int) NULL }; 
    return 0; 
} 

忽略所有其他的答案,如果你仍然想將其設置爲NULL。

0
int main() 
{ 
    Pair mark_and_space; 
    mark_and_space.mark = NULL; 
    mark_and_space.space = NULL; 
    return 0; 
}