如何在C中设置结构

时间:2014-02-07 06:59:11

标签: c linux memset

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

来做到这一点
main()
{
    struct data dataarray[100];
    memset(dataarray,0x00,sizeof(dataarray));
}

但如果我这样做会怎样呢

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

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

2 个答案:

答案 0 :(得分:4)

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

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


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

C116.7.9§21

  

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

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

C116.7.9§10

  

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

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

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

答案 1 :(得分:1)

C中的任何内容都可以用= 0初始化;这会将数字元素初始化为零,指针则为null。另请查看http://ex-parrot.com/~chris/random/initialise.html