在C中的while循环中,我声明了一个char[…],每次迭代我都必须清除它吗?

在C中的while循环中,我声明了一个char[…],每次迭代我都必须清除它吗?,c,memory-management,struct,C,Memory Management,Struct,在C中的while循环中,我声明了一个char[…],每次迭代我都必须清除它吗? 例如: while(clock()

在C中的while循环中,我声明了一个char[…],每次迭代我都必须清除它吗? 例如:

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


谢谢

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

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

char buf[1000] = { 0 };
而不是
memset
。(虽然在这种情况下
memset
也可以工作,但使用核心语言功能几乎总是比使用库函数更好)

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


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

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

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

char buf[1000] = { 0 };
而不是
memset
。(虽然在这种情况下
memset
也可以工作,但使用核心语言功能几乎总是比使用库函数更好)

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


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

内存集不是多余的。在每个新循环中,
buf
变量将在堆栈上重新分配。空间没有被检查或自动归零,你得到的就是你得到的。由于您取消了对
时钟的调用(每次调用都会占用堆栈上的空间),所以前几个字节很有可能成为垃圾。因此,调用memset是必要的。但是,作为一种优化,您可能希望在循环之外声明buf,以避免每次隐式地取消分配和重新分配


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

内存集不是多余的。在每个新循环中,
buf
变量将在堆栈上重新分配。空间没有被检查或自动归零,你得到的就是你得到的。由于您取消了对
时钟的调用(每次调用都会占用堆栈上的空间),所以前几个字节很有可能成为垃圾。因此,调用memset是必要的。但是,作为一种优化,您可能希望在循环之外声明buf,以避免每次隐式地取消分配和重新分配


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

如果我将声明(char buf[1000])移到循环外,并且在循环中有'buf={0},这会起作用吗?它不会改变指针,对吗?@Chris:如果你把声明移到外面,那么你就不能在循环中使用
={0}
语法。此语法只能在数组初始化中使用,但不能在以后的赋值中使用(数组是不可赋值的)。在这种情况下,您将不得不求助于
memset
。如果我将声明(char buf[1000])移到循环之外,并且在循环中有'buf={0}',这会起作用吗?它不会改变指针,对吗?@Chris:如果你把声明移到外面,那么你就不能在循环中使用
={0}
语法。此语法只能在数组初始化中使用,但不能在以后的赋值中使用(数组是不可赋值的)。在这种情况下,您必须求助于
memset
。是的,每次都必须使用全零,否则我将无法将其视为asciiz字符串。@Chris:asciiz字符串只需要一个终止NUL字符和C库函数(例如
strcpy
strcat
sprintf
)都是为了在对字符串进行操作时保留一个字符串:从效率的角度来看,将整个缓冲区初始化为NUL通常不是一个好主意。是的,每次都必须全部为零,否则我将无法将其视为asciiz字符串。@Chris:asciiz字符串只需要一个终止NUL字符,C库函数(例如,
strcpy
strcat
sprintf
)都是为了在操作字符串时保留一个函数而设计的:从效率的角度来看,将整个缓冲区初始化为NULs通常不是一个好主意。