假设我们有这样的结构:
struct A
{
int x;
int y;
};
Run Code Online (Sandbox Code Playgroud)
有什么区别
A a = {0};
Run Code Online (Sandbox Code Playgroud)
和
A a;
memset(&a,0,sizeof(A));
Run Code Online (Sandbox Code Playgroud)
Alo*_*ave 13
没有.最终结果是将结构成员初始化为0.
C99标准6.7.8.21
如果括号括起的列表中的初始值设定项少于聚合的元素或成员,或者用于初始化已知大小的数组的字符串文字中的字符数少于数组中的元素,则聚合的其余部分应为隐式初始化与具有静态存储持续时间的对象相同.
您的结构A是一个聚合,上面的规则适用于它.因此,所有结构成员的初始化值都与静态存储持续时间相同.这是0.
C99标准7.21.6.1 memset功能:
void *memset(void *s, int c, size_t n);
Run Code Online (Sandbox Code Playgroud)
memset函数将
c(转换为unsigned char)的值复制到n指向的对象的每个第一个字符中s.
简单来说,所有成员(包括结构对象中的对齐/填充位)A都设置为0.
请注意,C中两个构造之间的区别仅在于memset将对齐/填充设置0为,而聚合初始化仅保证将结构成员设置为0.
在任何一种情况下,您都无法通过约定语言结构访问对齐/填充字节,因此两者都可以获得相同的效果.
两者都将内存设置为0
第一个用于将静态分配内存设置为0
A a ={0}; // set a staic memory to 0
Run Code Online (Sandbox Code Playgroud)
你不能这样做:
A *a = malloc(sizeof(A)); a = {0} // This could not be done
Run Code Online (Sandbox Code Playgroud)
第二个用于将动态和静态分配内存设置为0
A a;
memset(&a,0,sizeof(A));
Run Code Online (Sandbox Code Playgroud)
你也可以
A *a = malloc(sizeof(A)); memset(a,0,sizeof(A));
Run Code Online (Sandbox Code Playgroud)
另一件事
当memset你使用设置内存时0,这里你正在调用一个函数(这需要时间).设置时{0},您不会调用函数.所以{0}可能比...更快memset
| 归档时间: |
|
| 查看次数: |
13664 次 |
| 最近记录: |