在C中的while循环中,我声明了char [..],我是否必须在每次迭代时清除它? 例如:
while (clock() < endTime) {
char buf[1000];
memset(buf, 0, sizeof buf); // Is this necessary?
}
缓冲区是否会在循环的每次迭代中自动初始化为全零?我的memset是多余的吗?
由于
答案 0 :(得分:7)
C语言中的本地对象永远不会自动初始化。你必须提供一个初始化器。否则,该对象将包含垃圾。
因此,您的memset
并非真正“多余”。但是,将缓冲区初始化为全零的正确方法是
char buf[1000] = { 0 };
而不是memset
。 (虽然在这种情况下memset
也可以使用,但使用核心语言功能几乎总是优先考虑库函数。
是的,如果你在循环体内声明你的缓冲区,你必须每次都重新初始化它。
当然,真正的问题是:每次迭代时,你真的需要一个初始化为全零的缓冲区吗?如果是这样,那么你每次都必须这样做。
答案 1 :(得分:1)
memset不是多余的。在每个新循环中,您的buf
变量将在堆栈上重新分配。空间不会被自动检查或归零,您可以获得所需的空间。由于您调用clock
(每次调用它将使用堆栈上的空间),因此前几个字节将是垃圾的几率非常好。所以是的,调用memset是必要的。但是,作为优化,您可能希望在循环外部声明buf,以避免每次都隐式地取消分配和重新分配。
当然,真正的问题是:你是否每次都需要它全部为零,或者这只是一种病态的强迫症(不要担心,我也这样做)。