2010-08-13 64 views
1

請原諒我,如果這是一個愚蠢的問題,我對C相當陌生,並且無法找到這個在線的例子,所以我假設我無法做到我想要。但是,希望這裏有人能指引我走向正確的方向。在頭文件中定義一個結構在它的聲明中的值

,所以我必須聲明,像這樣

typedef struct{ 

    float *float_array1; 

    float *float_array2; 

    int anInt; 

    int anotherInt; 

}IMAStruct; 

IMAStruct aStruct; 

我想ANINT總是被初始化爲當結構聲明0一個struct一個headerfile,浮子陣列MEM被分配根據是否是1或0;

問題是我正在處理一個巨大的項目,這個代碼是用在一個動作偵聽器中的,我真的不能修改代碼的任何其他部分。我只希望它運行一次代碼,然後跳過它。這似乎是一個很好的做法。

回答

1

這不是你應該在標題中做的事。

問題是該結構的聲明不執行任何代碼。調用malloc或製作條件分支需要執行代碼。

現在,你可以把它在GCC無論如何發生通過聲明這樣的函數:

void initAStruct __attribute__((init)) { 
    aStruct.anInt = 0; 
    aStruct.float_array2 = (float*)malloc(sizeof(float)*10); 
} 

在C99,我認爲這是可以與float float_array2[anInt*10];做,但你不能這樣做,在C89。

0

我不太清楚你想要什麼,但是因爲這是C而不是C++,所以你需要編寫一個函數來以你想要的方式初始化你的結構。 C沒有辦法指定結構的每個實例都以特定的初始化開始。你可以定義一個常量初始化器(作爲一個宏),並要求該結構的所有用戶都用它初始化它,但是當你需要動態分配時它不會工作。

+0

那麼我需要2個浮點數組進行動態分配。但Ints只是設置..我可能jjust拉出整型結構,這將更容易處理我認爲。 – 2010-08-13 16:52:05

+0

我想我可以檢查一下數組是否已經初始化......但是我無法完全弄清楚如何做到這一點,任何想法? – 2010-08-13 16:55:18

+0

如果您零初始化結構的新實例(提示:靜態/全局變量始終爲零初始化),那麼您可以檢查數組指針是否爲NULL。 – 2010-08-13 17:14:43

0

如果結構是在文件範圍(即在任何函數之外)(或在函數中,如果它是static)定義的,那麼它總是以相同的方式初始化:整數和浮點字段被初始化爲0,並且指針字段初始化爲NULL(這適用於嵌套結構和聯合遞歸)。

如果結構是在一個函數中定義的(「在堆棧上」或在堆中分配的「malloc」),這些字段不會自動初始化,並且它們首先包含發生在這些預先記憶的位。

沒有可移植的方式來指定程序初始化代碼;如果您的程序啓動時需要運行某些內容,則必須將其放入main。但是,有些平臺確實爲此提供了不可移植的擴展。

0

到處無論只是初始化它的文件或功能範圍是這樣的:

IMAStruct aStruct = { 0 }; 

這保證了所有字段都被初始化爲0NULL的指針。然後,您可以輕鬆檢測變量是否尚未初始化並觸發初始化。

在文件範圍內,這樣的初始化是多餘的,但我認爲在任何地方堅持使用相同的初始化規則會更容易。

相關問題