struct {0}和memset 0 之间有什么区别

可能重复:
使用哪一个 – memset()或值初始化将结构清零?

假设我们有这样的结构:

struct A { int x; int y; }; 

有什么区别

 A a = {0}; 

 A a; memset(&a,0,sizeof(A)); 

没有。 最终结果是将结构成员初始化为0

C99标准6.7.8.21

如果括号括起的列表中的初始值设定项少于聚合的元素或成员,或者用于初始化已知大小的数组的字符串文字中的字符数少于数组中的元素,则聚合的其余部分应为隐式初始化与具有静态存储持续时间的对象相同。

您的结构A是一个聚合,上面的规则适用于它。 因此,所有结构成员的初始化值都与静态存储持续时间相同。 这是0

C99标准7.21.6.1 memsetfunction:

 void *memset(void *s, int c, size_t n); 

memset函数将c的值(转换为unsigned char)复制到s指向的对象的前n字符中。

简单来说,包括结构A对象中的对齐/填充位的所有成员都设置为0

请注意, C中两个结构之间的区别仅在于memset将对齐/填充设置为0 ,而聚合初始化仅保证结构成员设置为0

在任何一种情况下,您都无法通过约定语言结构访问对齐/填充字节,因此两者都可以获得相同的效果。

两者都将内存设置为0

第一个用于仅将静态分配内存设置为0

 A a ={0}; // set a staic memory to 0 

你不能这样做:

 A *a = malloc(sizeof(A)); a = {0} // This could not be done 

第二个用于将动态和静态分配内存设置为0

 A a; memset(&a,0,sizeof(A)); 

你也可以这样做

 A *a = malloc(sizeof(A)); memset(a,0,sizeof(A)); 

另一件事

当使用memset将你的内存设置为0 ,这里你正在调用一个函数(这需要时间)。 使用{0}设置时,您不会调用函数。 所以{0}可能比memset更快