我需要在声明后将结构数组设置为0。我可以通过
来做到这一点main()
{
struct data dataarray[100];
memset(dataarray,0x00,sizeof(dataarray));
}
但如果我这样做会怎样呢
main()
{
struct data dataarray[100] = {0}
}
如果我使用memset(),则需要花费太多时间才能完成。我需要优化这个功能。那么我可以使用第二种方法将内存设置为0吗?第二种方法是否保证所有内存都初始化为0?
答案 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