最近專案小組在去除**中的warning,在修正**的過程中看到了對結構體不正確的初始化方式:
假設有乙個如下的struct定義:
structastruct
;structastruct test=;
即使astruct中都是基礎型別的成員這樣的初始化話也是不正確的。
這種初始化僅僅是把a變數設定為了0,而未對b變數做初始化。
產生這樣錯誤的原因,大概是收到陣列初始化的影響。陣列是可以這麼初始化話的,而且初始化的值只能是0!
對結構體的初始化,可以有一下三種。
structtest
;intmain()
;structtest t2=;
structtest t3=;
printf(「t1.a = %d, t1.b = %d/n」, t1.a, t1.b);
printf(「t2.a = %d, t2.b = %d/n」, t2.a, t2.b);
printf(「t3.a = %d, t3.b = %d/n」, t3.a, t3.b);
return0;}
第一種使我們最常見的方式,2,3種方式應該是c99所支援的,但是在微軟的編譯器中不支援c99,所以才會給人以只有gcc支援的錯覺。第一種方式盡量少寫。在生成彙編**時,會消耗掉非常多的時鐘週期。
(二)卡的驅動就不需要從目錄的結構 中讀取資料。那麼,相對應的file_operations重的項
就為 null。gcc還有乙個方便使用這種結構體的擴充套件。你會在較現代的驅動核心模組中見到。 新的使用這種結構體的方式如下:
struct file_operations fops = ;
同樣也有c99語法的使用該結構體的方法,並且它比gnu擴充套件更受推薦。我使用的版本為 2.95為了方便那些想移植你的**的人,你最好使用這種語法。它將提高**的相容性:
struct file_operations fops = ;
(三)#include
struct date
;void main()
; //2008-2-12
//struct date time_1=; //2008-2-2
//struct date time_1=; //2008-2008-12
//struct date time_1=; //2008-12-2008
//struct date time_1=; //2008-2-2
//struct date time_1=; //2008-2-2008
printf("%d-%d-%d/n",time_1.year,time_1.month,time_1.day);
}用此種方式時,struct date time_1=;//2008-2-2
其初始化順序不能調..
**:
結構體初始化 指定初始化
參考 c99支援結構的指定初始化專案,其語法與陣列的指定初始化專案近似。只是,結構的指定初始化專案使用點運算子和成員名 而不是方括號和索引值 來標識具體的元素。例如,只初始化book結構的成員value,可以這樣做 struct book surprise 可以按照任意的順序使用指定初始化專案 st...
結構體初始化
結構體變數初始化 tag 結構體,結構體變數,結構體變數宣告,結構體變數初始化,結構體變數引用,結構體成員變數引用 text c語言中引用變數的基本原則是在使用變數前,需要對變數進行定義並初始化。其方法是在定義變數的同時給其一初始值。結構體變數的初始化,遵循相同的規律。簡單變數的初始化形式如下 資料...
結構體的初始化
早先在看開源 中學到的乙個初始化結構體的技巧,今天剛剛用上。特意整理了一下。struct a 早先我所採用的方法 方法一 struct a a a.a 1 a.b 2 現在所採用的方法 方法二 是從開源 中所學會的,定義結構體的同時初始化結構體成員變數 struct a a 相比較方法一,方法二明顯...