可能重复:
使用哪一个- memset的()或值初始化为零出一个结构?
假设我们结构是这样的:
struct A
{
int x;
int y;
};
之间有什么区别
A a = {0};
和
A a;
memset(&a,0,sizeof(A));
可能重复:
使用哪一个- 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的memset的功能:
void *memset(void *s, int c, size_t n);
该memset的功能的副本的值
c
(转换为无符号字符)到每个第一n
对象的字符由指向s
。
简单地说,包括所有在你的结构的物体的对准/填充比特的部件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