如何在 C 中存储结构

Chi*_*nna 0 c linux memset

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

main()
{
    struct data dataarray[100];
    memset(dataarray,0x00,sizeof(dataarray));
}
Run Code Online (Sandbox Code Playgroud)

但是如果我像下面那样做怎么办

main()
{
   struct data dataarray[100] = {0}
}
Run Code Online (Sandbox Code Playgroud)

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

Lun*_*din 5

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

\n\n

如果该结构在文件范围内声明或声明为static. 在这种情况下,它将具有静态存储持续时间,并且由于它被设置为零,因此它将被分配在名为 .bss 的内存段中,其中结构在程序启动之前已被设置为零。

\n\n
\n\n

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

\n\n

C11 6.7.9 \xc2\xa721

\n\n
\n

“如果大括号括起来的列表中的初始化程序少于聚合的元素或成员...” ///“...聚合的其余部分应隐式初始化,与具有 static 的对象相同储存期限。

\n
\n\n

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

\n\n

C11 6.7.9 \xc2\xa710

\n\n
\n

“如果具有静态或线程存储持续时间的对象未\n显式初始化,则:”/--/

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

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

\n