在C中的while循环中,我声明了char [..],我是否必须在每次迭代时清除它?

时间:2011-04-05 05:33:01

标签: c memory-management struct

在C中的while循环中,我声明了char [..],我是否必须在每次迭代时清除它? 例如:

while (clock() < endTime) { 
    char buf[1000];
    memset(buf, 0, sizeof buf); // Is this necessary?
}

缓冲区是否会在循环的每次迭代中自动初始化为全零?我的memset是多余的吗?

由于

2 个答案:

答案 0 :(得分:7)

C语言中的本地对象永远不会自动初始化。你必须提供一个初始化器。否则,该对象将包含垃圾。

因此,您的memset并非真正“多余”。但是,将缓冲区初始化为全零的正确方法是

char buf[1000] = { 0 };

而不是memset。 (虽然在这种情况下memset也可以使用,但使用核心语言功能几乎总是优先考虑库函数。

是的,如果你在循环体内声明你的缓冲区,你必须每次都重新初始化它。

当然,真正的问题是:每次迭代时,你真的需要一个初始化为全零的缓冲区吗?如果是这样,那么你每次都必须这样做。

答案 1 :(得分:1)

memset不是多余的。在每个新循环中,您的buf变量将在堆栈上重新分配。空间不会被自动检查或归零,您可以获得所需的空间。由于您调用clock(每次调用它将使用堆栈上的空间),因此前几个字节将是垃圾的几率非常好。所以是的,调用memset是必要的。但是,作为优化,您可能希望在循环外部声明buf,以避免每次都隐式地取消分配和重新分配。

当然,真正的问题是:你是否每次都需要它全部为零,或者这只是一种病态的强迫症(不要担心,我也这样做)。

相关问题