簡體   English   中英

memset 和初始化(數組)的區別?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM