在C中的一个while循环中,我声明了一个char [..],我必须每次迭代都清除它吗? 如:在C中的while循环中,我声明了一个char [..],我是否必须清除它每次迭代?
while (clock() < endTime) {
char buf[1000];
memset(buf, 0, sizeof buf); // Is this necessary?
}
将缓冲区中循环的每个迭代初始化自动全零?我的memset是多余的吗?
谢谢
在C中的一个while循环中,我声明了一个char [..],我必须每次迭代都清除它吗? 如:在C中的while循环中,我声明了一个char [..],我是否必须清除它每次迭代?
while (clock() < endTime) {
char buf[1000];
memset(buf, 0, sizeof buf); // Is this necessary?
}
将缓冲区中循环的每个迭代初始化自动全零?我的memset是多余的吗?
谢谢
C languauge中的本地对象永远不会自动初始化。你必须提供一个初始化器。否则,该对象将包含垃圾。
所以,你的memset
是不是真的“多余”。但是,对缓冲区初始化为全零的正确方法是
char buf[1000] = { 0 };
,而不是memset
。 (尽管在这种情况下memset
也可以工作,但使用核心语言功能几乎总是比库函数更好)。
是的,如果你在循环体内声明你的缓冲区,你必须每次重新初始化它。
当然,真正的问题是:你真的需要每次迭代时初始化为全零的缓冲区吗?如果是这样,那么你必须每次都这样做。
memset不是多余的。在每个新循环中,您的buf
变量将被重新分配到堆栈上。该空间不被自动检查或调零,你会得到你所得到的。赔率相当不错,前几个字节将是垃圾感谢您致电clock
(每次您调用它将使用堆栈空间)。所以是的,调用memset是必要的。然而,作为优化,您可能想要在循环之外声明buf以避免每次都隐式地解除分配和重新分配。
当然,真正的问题是:你是否需要它每次都是零,或者这只是一种生病的强迫症形式(别担心,我也是这样)。
每次都是零都是必要的,否则我将无法将它视为一个asciiz字符串。 – Chris 2011-04-05 06:02:59
@Chris:ASCIIZ字符串只需要一个终止NUL字符,并且C库函数(例如'strcpy','strcat','sprintf')都被设计为在您操作字符串时保留一个:它通常不是(从效率的角度来看)将整个缓冲区初始化为NUL。 – 2011-04-05 07:05:13
如果我移动循环外部的声明(char buf [1000]),并在循环中有'buf = {0}',那会起作用吗?它不会改变指针,对吧? – Chris 2011-04-05 05:42:27
@Chris:如果您将声明移到外部,那么您将无法在循环中使用'= {0}'语法。此语法只能用于数组初始化,但不能用于以后的赋值(数组不可分配)。在这种情况下,你将不得不求助于'memset'。 – AnT 2011-04-05 06:08:33