2011-04-05 31 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

相关问题