gpt4 book ai didi

c - 如何在 C 中 memset 一个结构

转载 作者:塔克拉玛干 更新时间:2023-11-03 01:52:34 25 4
gpt4 key购买 nike

我需要在声明后将结构数组设置为 0。我可以通过

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

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

main()
{
struct data dataarray[100] = {0}
}

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

最佳答案

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

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


关于结构填充字节的初始化:C 标准保证如果一个“聚合”(意思是一个数组或一个结构或一个 union )没有显式初始化它的所有成员,它会将它们全部设置为零。这包括填充。

C11 6.7.9 §21

"If there are fewer initializers in a brace-enclosed list than there are elements or members of an aggregate..." /-/ "...the remainder of the aggregate shall be initialized implicitly the same as objects that have static storage duration.

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

C11 6.7.9 §10

"If an object that has static or thread storage duration is not initialized explicitly, then:" /--/

  • if it is an aggregate, every member is initialized (recursively) according to these rules, and any padding is initialized to zero bits;

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

关于c - 如何在 C 中 memset 一个结构,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21621249/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com