2011-04-05 54 views

回答

7

C languauge中的本地對象永遠不會自動初始化。你必須提供一個初始化器。否則,該對象將包含垃圾。

所以,你的memset是不是真的「多餘」。但是,對緩衝區初始化爲全零的正確方法是

char buf[1000] = { 0 }; 

,而不是memset。 (儘管在這種情況下memset也可以工作,但使用核心語言功能幾乎總是比庫函數更好)。

是的,如果你在循環體內聲明你的緩衝區,你必須每次重新初始化它。

當然,真正的問題是:你真的需要每次迭代時初始化爲全零的緩衝區嗎?如果是這樣,那麼你必須每次都這樣做。

+0

如果我移動循環外部的聲明(char buf [1000]),並在循環中有'buf = {0}',那會起作用嗎?它不會改變指針,對吧? – Chris 2011-04-05 05:42:27

+0

@Chris:如果您將聲明移到外部,那麼您將無法在循環中使用'= {0}'語法。此語法只能用於數組初始化,但不能用於以後的賦值(數組不可分配)。在這種情況下,你將不得不求助於'memset'。 – AnT 2011-04-05 06:08:33

1

memset不是多餘的。在每個新循環中,您的buf變量將被重新分配到堆棧上。該空間不被自動檢查或調零,你會得到你所得到的。賠率相當不錯,前幾個字節將是垃圾感謝您致電clock(每次您調用它將使用堆棧空間)。所以是的,調用memset是必要的。然而,作爲優化,您可能想要在循環之外聲明buf以避免每次都隱式地解除分配和重新分配。

當然,真正的問題是:你是否需要它每次都是零,或者這只是一種生病的強迫症形式​​(別擔心,我也是這樣)。

+0

每次都是零都是必要的,否則我將無法將它視爲一個asciiz字符串。 – Chris 2011-04-05 06:02:59

+1

@Chris:ASCIIZ字符串只需要一個終止NUL字符,並且C庫函數(例如'strcpy','strcat','sprintf')都被設計爲在您操作字符串時保留一個:它通常不是(從效率的角度來看)將整個緩衝區初始化爲NUL。 – 2011-04-05 07:05:13

相關問題