假设我们有这样的结构体:
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 memset函数:
void *memset(void *s, int c, size_t n);
memset函数将c
(转换为无符号字符)的值复制到指向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
A a;
memset(&a,0,sizeof(A));
A *a = malloc(sizeof(A)); memset(a,0,sizeof(A));
另一件事情
使用 memset
将内存设置为 0
时,你在调用一个函数(这需要时间)。而使用 {0}
进行设置时,并不会调用函数。因此,{0}
可能比 memset
更快。
*a = (A){0}
即可。 - Craig Barnes
A a = { 0 };
能保证将填充位也设置为0吗?如果不能,那也是一个区别。 - user529758struct A a = {0};
) - Daniel Fischer