Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/linux/26.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在C中设置结构_C_Linux_Memset - Fatal编程技术网

如何在C中设置结构

如何在C中设置结构,c,linux,memset,C,Linux,Memset,我需要在声明后将结构数组设置为0。我可以自己做 main() { struct data dataarray[100]; memset(dataarray,0x00,sizeof(dataarray)); } 但是如果我像下面这样做呢 main() { struct data dataarray[100] = {0} } 如果我使用memset(),则需要花费太多时间才能完成。我需要优化这个函数。所以我可以使用第二种方法将内存设置为0吗?第二种方法是否保证所有内存都初始

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

main()
{
    struct data dataarray[100];
    memset(dataarray,0x00,sizeof(dataarray));
}
但是如果我像下面这样做呢

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

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

C中的任何东西都可以用=0初始化;这将数字元素初始化为零,指针为null。另外,请看

C中的任何内容都可以用=0初始化;这将数字元素初始化为零,指针为null。另外请看

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

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


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

C116.7.9§21

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

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

C116.7.9§10

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

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

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

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

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


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

C116.7.9§21

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

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

C116.7.9§10

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

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

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

如果设置为零“花费太多时间”,您是否考虑过是否需要初始化变量?也许你会立即覆盖它们?我需要减少将内存设置为零所需的时间,使其成为全局的方式要快得多。您的结构数据内容是什么??填充可能会在时间上起作用。@Karthik否,使其获得静态存储持续时间可能会或可能不会使代码更快。这完全取决于在启动时设置.bss的复制代码的实现是否与memset不同。因此,这取决于系统。如果你把程序的执行时间作为一个整体来看,从程序开始到结束,你不可能通过静态存储而不是自动分配零初始化变量来获得任何性能提升。如果设置为零“花费太多时间”,您是否考虑过是否需要初始化变量?也许你会立即覆盖它们?我需要减少将内存设置为零所需的时间,使其成为全局的方式要快得多。您的结构数据内容是什么??填充可能会在时间上起作用。@Karthik否,使其获得静态存储持续时间可能会或可能不会使代码更快。这完全取决于在启动时设置.bss的复制代码的实现是否与memset不同。因此,这取决于系统。如果你把程序的执行时间作为一个整体来看,从它开始到结束,通过分配零初始化变量和静态存储,你不可能获得任何性能增益,而不是自动。
struct data x=0
将向您提供类似于
无效初始值设定项的错误。
还必须写入
{0}
struct data x=0
将向您提供类似于
无效初始值设定项的错误