[英]Difference between memset and initialization (array)?
我一直在使用一些 C 代碼,我想知道下一個代碼之間有什么區別:
double myArray[5] = {0,0,0,0,0};
和
double myArray[5];
memset(myArray,0,5*sizeof(double));
用第一個替換第二個會不會有問題? 如果是這樣,可能會出現什么樣的問題?
以這種方式使用memset
對浮點數的表示進行了假設,特別是所有位 0 的表示對應於值 0。
如果您的系統使用 IEEE754 浮點表示(與您可能遇到的大多數系統一樣),則此假設成立。 但是,如果您發現自己在一些沒有的外來系統上運行您的代碼,那么您可能不會得到您期望的結果。
除了dbush 的回答之外,盡管在使用memset
大多數現代系統上可能不會出現問題,但memset
版本(如所寫)更脆弱。 如果有一天您決定更改myArray
的大小,那么使用支撐初始化列表的版本會發生以下兩種情況之一:
myArray
的大小,您將收到關於初始值設定項過多的編譯錯誤。myArray
的大小,則任何沒有顯式初始化程序的元素都將自動初始化為 0。 相比之下,使用memset
版本:
memset
進行相應更改的情況下減小了myArray
的大小,則memset
將寫入超出數組的邊界,這是未定義的行為。memset
進行相應更改的情況下增加了myArray
的大小,則最后的元素將是未初始化的垃圾。 (使用memset
更好方法是執行memset(myArray, 0, sizeof myArray)
。)
最后,IMO 首先使用memset
更容易出錯,因為很容易混淆參數的順序。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.