13

假设我们有这样的结构:

struct A
{
    int x;
    int y;
};

有什么区别

A a = {0};

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

2 回答 2

14

没有任何。最终结果是两者都将结构成员初始化为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.

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

于 2012-12-25T15:04:22.480 回答
6

两者都将内存设置为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

于 2012-12-25T15:06:31.323 回答