如何在 C 中 memset 结构

Posted

技术标签:

【中文标题】如何在 C 中 memset 结构【英文标题】:How to memset a structure in C 【发布时间】:2014-02-07 06:59:11 【问题描述】:

我需要在声明后将结构数组设置为 0。我可以这样做

main()

    struct data dataarray[100];
    memset(dataarray,0x00,sizeof(dataarray));

但是如果我像下面那样做呢

main()

   struct data dataarray[100] = 0

如果我使用 memset() 会花费太多时间来完成。我需要优化这个功能。那么我可以使用第二种方法将内存设置为 0 吗?第二种方法是否保证所有内存都初始化为0?

【问题讨论】:

如果设置为零“花费太多时间”,您是否考虑过是否需要初始化变量?也许你会立即覆盖它们? 我需要减少将内存设置为零的时间 使其全球化是更快的方式! .你的结构数据内容是什么?填充可能会及时发挥作用。 @Karthik 不,让它获得 static storage duration 可能会也可能不会使代码更快。这完全取决于在启动时设置 .bss 的复制代码的实现是否与 memset 不同。所以这取决于系统。如果您从整个程序的执行时间来看,从开始到结束,我不太可能通过使用静态存储而不是自动分配零初始化变量来获得任何性能提升。 【参考方案1】:

贴出的代码中这两种方法没有实际区别。在任何一种情况下,您都将整个结构设置为零(包括任何填充字节)。在任何一种情况下,执行此操作的代码都会在程序进入 main() 时在“运行时”中执行。

如果结构在文件范围内声明或声明为static,前者(memset 版本)和后者(初始化)之间会有显着差异。在这种情况下,它将具有静态存储持续时间,并且由于它被设置为零,它将被分配在一个名为 .bss 的内存段中,其中结构在程序启动之前将被设置为零.


关于结构填充字节的初始化:C 标准保证,如果“聚合”(表示数组、结构或联合)没有显式初始化其所有成员,则将它们全部设置为零。这包括填充。

C11 6.7.9 §21

"如果大括号括起来的列表中的初始值设定项比那里少 是聚合的元素或成员..." /-/ "...聚合的其余部分应隐式初始化,与具有静态存储持续时间的对象相同。

然后我们可以检查一个具有静态存储持续时间的结构是如何初始化的:

C11 6.7.9 §10

"如果具有静态或线程存储持续时间的对象不是 显式初始化,则:" /--/

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

因此,无论您编写dataarray[100] = 0 还是memset,都保证将包括任何填充在内的完整聚合设置为零。

【讨论】:

【参考方案2】:

C 中的任何东西都可以用 = 0 进行初始化;这将数字元素初始化为零并指向 null。也请看http://ex-parrot.com/~chris/random/initialise.html

【讨论】:

struct data x = 0 会给你类似invalid initializer的错误。另外你必须写0

以上是关于如何在 C 中 memset 结构的主要内容,如果未能解决你的问题,请参考以下文章

为啥我们在套接字编程c中使用memset将结构填充为0?

在 C++ 中处理字符串时如何使用 memset? [关闭]

C语言中 如何把字符串中某一位清空?

结构c内的memset数组

您如何比较 C 中的结构是不是相等?

在结构元素上使用 memset 的正确方法是啥?