2014-02-07 35 views
0

我需要在聲明後將結構數組設置爲0。我可以如何在C中memset結構

main() 
{ 
    struct data dataarray[100]; 
    memset(dataarray,0x00,sizeof(dataarray)); 
} 

做,但如果我不喜歡它下面

main() 
{ 
    struct data dataarray[100] = {0} 
} 

如果我使用的memset()正在採取太多的時間來完成什麼。我需要優化這個功能。那麼我可以使用第二種方法將內存設置爲0嗎?第二種方法保證所有內存都被初始化爲0?

+0

如果設置爲零「花費太多時間」,您是否考慮過是否需要初始化變量?無論如何你可能會立即覆蓋它們? –

+0

我需要減少將內存設置爲零的時間 – Chinna

+1

使其成爲全球更快的方式! 。你的結構數據內容是什麼?填充可能會及時發揮作用。 – const

回答

4

在發佈的代碼中,這兩種方法沒有實際區別。無論哪種情況,您都將整個結構設置爲零(包括任何填充字節)。無論哪種情況,執行此操作的代碼都在「運行時」執行,當程序進入main()時。

前者(memset版本)和後者(初始化)之間會有一個顯着的區別,如果該結構聲明在文件範圍或static。在那種情況下,它將具有靜態存儲持續時間並且由於它被設置爲零,所以它將被分配在稱爲.bss的存儲器段中,其中在程序啓動之前該結構將被設置爲零。


關於的結構填充字節初始化:C標準保證,如果一個「聚合」(意爲一個陣列或結構或聯合)不具有其所有成員顯式初始化的,它將設置所有這些歸零。這包括填充。

C11 6.7.9§21

「如果有在大括號內的列表更少初始化值多於 是聚集體的元件或部件...」/ - /」 .. .the總的剩餘部分作爲應具有靜態存儲持續時間對象初始化隱含相同

然後我們可以檢查如何與靜態存儲時間AA結構被初始化:

C11 6.7.9§10

「如果具有靜態或線程存儲時限的對象不明確 初始化,然後:」/ -/

  • 如果它是一個聚合,根據這些規則對每個成員進行初始化(遞歸),並且將任何填充初始化爲零位;

所以不管你寫dataarray[100] = {0}memset,完整的彙總,包括任何填充,可以保證被設爲零。

+0

+1麪糊說明 –

+0

優秀點,好工作。 –

1

C中的任何內容都可以用= 0來初始化;這將數字元素初始化爲零,指針爲空。請看http://ex-parrot.com/~chris/random/initialise.html

+0

'struct data x = 0;'??? –

+0

'struct data x = 0'會給你錯誤,比如'invalid initializer'.Also你必須編寫'{0}'。 –