我已经看到了两种不同的方法来填充char[]
0
(在此示例中,初始化时):
/* method 1 */
char foo[1024] = {0};
/* method 2 */
char foo[1024];
memset(foo, '\0', sizeof(foo));
两个代码之间的主要区别是什么?它们在功能上有何不同等等?
答案 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周期,并且可以根据需要多次发生。