在c中将结构的内存区域归零[重复]

Posted

技术标签:

【中文标题】在c中将结构的内存区域归零[重复]【英文标题】:zeroing memory area of a structure in c [duplicate] 【发布时间】:2018-09-18 08:45:20 【问题描述】:

我有以下结构,我想将它初始化为零。

struct example 
     int a;
     int b;
     char c;
;
struct example mystruct;

我可以通过以下方式将 mystruct 设置为零:

memset(&mystruct, 0, sizeof(mystruct));

mystruct = (struct example) 0;

第二种方式和第一种方式一样吗?

请注意,我不仅要在变量定义时将 mystruct 变量初始化为零,还可能是为了重用它。

【问题讨论】:

你关心填充字节吗? 是的。无论如何,结构的大小将包括填充字节。 当然大小会包括它们。但是你关心那些字节的内容吗? 【参考方案1】:

好吧,在您的情况下,它们将是等效的(忽略填充字节)。

引用C11,第 §6.7.9/P21 章,(强调我的

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

并且,关于静态存储持续时间对象的初始化,P10(再次强调我的

[...] 如果具有静态或线程存储持续时间的对象未初始化 明确地,那么:

——如果是指针类型,则初始化为空指针;

——如果是算术类型,则初始化为(正或无符号)零;

如果是聚合,则每个成员都根据这些规则进行初始化(递归), 并且任何填充都被初始化为零位;

——如果它是一个联合,第一个命名的成员根据这些被初始化(递归) 规则,并且任何填充都被初始化为零位;


为了完整起见,如below comment by Serge Ballesta中所述:

所有剩余成员将被隐式初始化,与具有静态存储持续时间的对象相同。并且该标准对***对象的填充位没有任何要求

这表明,在第一个对象/成员的情况下,对于填充值,分配将不同于 memset() 调用。

【讨论】:

我不同意。如果 所有剩余成员 将被隐含地初始化为与具有静态存储持续时间的对象相同,我对 C11 引用的引用的阅读。并且该标准对***对象的填充位没有任何要求。 @SergeBallesta 我不否认......这是正确的。更新了我的答案以解决这个问题。【参考方案2】:

不,它们不相等。

第一个更底层,它将值的所有位设置为 0,包括那些不属于任何成员的位(填充)。

后者只保证将实际成员设置为零,因此它可能会更快,因为它有机会接触更少的内存。

【讨论】:

我相信,在后面的情况下,填充也会被设置为零(就像在静态存储中一样),不是吗? 你确定后者会更快吗? memset 可以是高度优化的低级例程... @SergeBallesta 不,我当然不确定,因此“可能会更快”。当然,编译器知道这一点,如果这是最好的选择,它只会使用调用 memset() 来实现清除。 你最后的评论已经足够清楚了(反正已经投票了......)

以上是关于在c中将结构的内存区域归零[重复]的主要内容,如果未能解决你的问题,请参考以下文章

java基础 --- Java内存结构

java基础 --- Java内存结构

在C代码中将数组归零[重复]

Linux 内核 内存管理分区伙伴分配器 ⑤ ( 区域水线 | 区域水线数据结构 zone_watermarks 枚举 | 内存区域 zone 中的区域水线 watermark 成员 )

Linux 内核 内存管理分区伙伴分配器 ⑤ ( 区域水线 | 区域水线数据结构 zone_watermarks 枚举 | 内存区域 zone 中的区域水线 watermark 成员 )

Linux 内核 内存管理内存映射相关数据结构 ⑥ ( 文件映射 虚拟内存区域 | vm_area_struct | vm_operations_struct | 匿名映射 虚拟内存区域 )