正确清除阵列

时间:2016-12-17 08:01:37

标签: c arrays memset

我已经看到了两种不同的方法来填充char[] 0(在此示例中,初始化时):

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

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

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

4 个答案:

答案 0 :(得分:2)

  

两个代码之间的主要区别是什么?

在案例1中,阵列从可以使用的那一刻起就被清零,因为它已经初始化

在案例2中,只有在调用 public class EventBus extends Bus { private static EventBus eventBus; public static EventBus getInstance(){ if(eventBus == null){ eventBus = new EventBus(); } return eventBus; } } 之后才能很好地定义其内容。

本质上的区别在于,对于案例2,存在memset()的内容为"垃圾"的差距。情况1的情况并非如此。

答案 1 :(得分:1)

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

性能方面,我不知道哪个更快,你必须测量它。顺便说一句,您可以在memset中使用/etc/php.ini代替0

'\0'

答案 2 :(得分:1)

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

没有办法可以用第一个错误地写入错误的数据长度。

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

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

答案 3 :(得分:0)

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

在方法1中,数组的设置发生在程序加载时,通常来自文字,并且只能在每次进入“范围”时出现一次。数组。

/* method 2 */
char foo[1024];
memset(foo, '\0', sizeof(foo));
方法2中的

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