對結構體初始化

2021-07-22 04:26:10 字數 2802 閱讀 5074

對結構體

struct a

有幾種初始化方式:

struct a a1 = ;

或者struct a a1 =

或者struct a a1 = ;

核心喜歡用第一種,使用第一種和第二種時,成員初始化順序可變。

轉一篇文章

在閱讀gnu/linux核心**時,我們會遇到一種特殊的結構初始化方式。該方式是某些c教材(如譚二版、k&r二版)中沒有介紹過的。這種方式稱為指定初始化(designated initializer)。下面我們看乙個例子,linux-2.6.x/drivers/usb/storage/usb.c中有這樣乙個結構體初始化專案:

static struct usb_driver usb_storage_driver = ;

乍一看,這與我們之前學過的結構體初始化差距甚遠。其實這就是前面所說的指定初始化在linux裝置驅動程式中的乙個應用,它源自iso c99標準。以下我摘錄了c primer plus第五版中相關章節的內容,從而就可以很好的理解2.6版核心採用這種方式的優勢就在於由此初始化不必嚴格按照定義時的順序。這帶來了極大的靈活性,其更大的益處還有待大家在開發中結合自身的應用慢慢體會。

已知乙個結構,定義如下

struct book ;

c99支援結構的指定初始化專案,其語法與陣列的指定初始化專案近似。只是,結構的指定初始化專案使用點運算子和成員名(而不是方括號和索引值)來標識具體的元素。例如,只初始化book結構的成員value,可以這樣做:

struct book surprise = ;

可以按照任意的順序使用指定初始化專案:

struct book gift = ;

正像陣列一樣,跟在乙個指定初始化專案之後的常規初始化專案為跟在指定成員後的成員提供了初始值。另外,對特定成員的最後一次賦值是它實際獲得的值。例如,考慮下列宣告:

struct book gift = ;

這將把值0.25賦給成員value,因為它在結構宣告中緊跟在author成員之後。新的值0.25代替了早先的賦值18.90。

有關designated initializer的進一步資訊可以參考c99標準的6.7.8節ininialization。

摘自:標準c89需要初始化語句的元素以固定的順序出現,和被初始化的陣列或結構體中的元素順序一樣。

在iso c99中,你可以按任何順序給出這些元素,指明它們對應的陣列的下標或結構體的成員名,並且gnu c也把這作為c89模式下的乙個擴充套件。這個擴充套件沒有在gnu c++中實現。

為了指定乙個陣列下標,在元素值的前面寫上「[index] =」。比如:

int a[6] = ;

相當於:

int a[6] = ;

下標值必須是常量表示式,即使被初始化的陣列是自動的。

乙個可替代這的語法是在元素值前面寫上「.[index]」,沒有「=」,但從gcc 2.5開始就不再被使用,但gcc仍然接受。為了把一系列的元素初始化為相同的值,寫為「[first ... last] = value」。這是乙個gnu擴充套件。比如:

int widths = ;

如果其中的值有***,這個***將只發生一次,而不是範圍內的每次初始化一次。

注意,陣列的長度是指定的最大值加一。

在結構體的初始化語句中,在元素值的前面用「.fieldname =」指定要初始化的成員名。例如,給定下面的結構體,

struct point ;

和下面的初始化,

struct point p = ;

等價於:

struct point p = ;

另一有相同含義的語法是「.fieldname:」,不過從gcc 2.5開始廢除了,就像這裡所示:

struct point p = ;

[index]」或「.fieldname」就是指示符。在初始化共同體時,你也可以使用乙個指示符(或不再使用的冒號語法),來指定共同體的哪個元素應該使用。比如:

union foo ;

union foo f = ;

將會使用第二個元素把4轉換成乙個double型別來在共同體存放。相反,把4轉換成union foo型別將會把它作為整數i存入共同體,既然它是乙個整數。(參考5.24節向共同體型別轉換。)

你可以把這種命名元素的技術和連續元素的普通c初始化結合起來。每個沒有指示符的初始化元素應用於陣列或結構體中的下乙個連續的元素。比如,

int a[6] = ;

等價於

int a[6] = ;

當下標是字元或者屬於enum型別時,標識陣列初始化語句的元素特別有用。例如:

int whitespace[256]

= ;

你也可以在「=」前面寫上一系列的「.fieldname」和「[index]」指示符來指定乙個要初始化的巢狀的子物件;這個列表是相對於和最近的花括號對一致的子物件。比如,用上面的struct point宣告:

struct point ptarray[10] = ;

如果同乙個成員被初始化多次,它將從最後一次初始化中取值。如果任何這樣的覆蓋初始化有***,***發生與否是非指定的。目前,gcc會捨棄它們並產生乙個警告。

結構體初始化 指定初始化

參考 c99支援結構的指定初始化專案,其語法與陣列的指定初始化專案近似。只是,結構的指定初始化專案使用點運算子和成員名 而不是方括號和索引值 來標識具體的元素。例如,只初始化book結構的成員value,可以這樣做 struct book surprise 可以按照任意的順序使用指定初始化專案 st...

結構體初始化

結構體變數初始化 tag 結構體,結構體變數,結構體變數宣告,結構體變數初始化,結構體變數引用,結構體成員變數引用 text c語言中引用變數的基本原則是在使用變數前,需要對變數進行定義並初始化。其方法是在定義變數的同時給其一初始值。結構體變數的初始化,遵循相同的規律。簡單變數的初始化形式如下 資料...

C 結構體初始化

今天在看mfc結構時,順便看了看 深入淺出mfc 發現有這麼一行 m pmainwnd new cmyframewnd 乍一看,很正常啊,再仔細一看,貌似 new cmyframewnd 的時候少了一對括號。奇怪!之後又翻了翻書,發現好多處都是這樣的。難道我弄錯了,不可能啊,一般情況下在new乙個新...