正确清除数组

Properly clearing an array

我见过用 0 填充 char[] 的两种不同方法(在此示例中,在初始化时):

/* method 1 */
char foo[1024] = {0};

/* method 2 */
char foo[1024];
memset(foo, '[=10=]', sizeof(foo));

这两个代码之间的主要区别是什么?它们在功能等方面有何不同?

第一种方法通常更好,因为它零初始化所有成员。 Mem 设置为 0 并不总是与零初始化相同,特别是对于浮点和指针成员,它们可能有 0 个值,但并非所有位都为零。

性能方面,我不知道哪个更快,你必须衡量它。顺便说一下,你可以在 memset 中使用 0 而不是 '[=12=]'

memset(foo, 0, sizeof(foo));

What are the main differences between the two codes?

在情况 1 中,数组从可以使用的那一刻起就被清零了,因为它得到了初始化

在情况 2 中,它的内容只有在调用 memset().

之后才被明确定义

本质区别在于,对于情况 2,foo 的内容为 "garbage" 存在间隙。情况 1 并非如此。

/* method 1 */
char foo[1024] = {0};

在方法 1 中,数组的设置发生在程序加载时,通常来自文字,并且对于数组的 'scope' 中的每个条目只能发生一次。

/* method 2 */
char foo[1024];
memset(foo, '[=11=]', sizeof(foo));

在方法 2 中,数组的设置发生在运行时,消耗运行时 CPU 个周期,并且可以根据需要多次发生。

这两个代码的效果是一样的。在这两种情况下,编译器可能会生成相同的程序集。然而,第一个更容易阅读和维护。

您不可能不小心将第一个数据写入错误的数据长度。

此外,= { 0 }; 习语可用于初始化所有命名数组和结构:整数获取 0 值,浮点数获取 0.0 ,指针获取空指针。 memset 版本只保证这三件事中的第一件事。

因此,如果您正在编写可移植代码,有时无论如何您都需要使用 = { 0 } -- 所以您不妨每次都使用它。