Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/drupal/3.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编译器将整个结构赋值为零,而不使用for循环_C_Struct_Variable Assignment - Fatal编程技术网

技巧C编译器将整个结构赋值为零,而不使用for循环

技巧C编译器将整个结构赋值为零,而不使用for循环,c,struct,variable-assignment,C,Struct,Variable Assignment,我目前正在编写嵌入式操作系统的一小部分,有时需要将大型结构中的所有变量赋值为0。元素范围从uint8到uint64。 到目前为止,我唯一要做的就是循环遍历每种类型的变量,将每种类型的变量赋值为0,但这需要很多周期,而且代码“难看”。 我在想,是否可以创建一个结构类型的指针,然后将指针元素的值赋给0,因为该元素的大小应该是sizeof(MyStruct) 要分配给0的结构: struct AMD64Context{ uint8_t fp_context[512] __attribute__((al

我目前正在编写嵌入式操作系统的一小部分,有时需要将大型结构中的所有变量赋值为0。元素范围从uint8到uint64。 到目前为止,我唯一要做的就是循环遍历每种类型的变量,将每种类型的变量赋值为0,但这需要很多周期,而且代码“难看”。 我在想,是否可以创建一个结构类型的指针,然后将指针元素的值赋给0,因为该元素的大小应该是sizeof(MyStruct)

要分配给0的结构:

struct AMD64Context{
uint8_t fp_context[512] __attribute__((alligned(16)));
uint64_t rax;
.... 
....
};
两种“经典”方法:

  • memset

    AMD64Contex context;
    memset(&context, 0, sizeof(context));
    
  • 使用
    {0}

    AMD64Contex context={0};
    
请注意,结果略有不同:在第一种情况下,您将残酷地将所有内存归零,这将确保所有整型字段为零,并且可能存在的任何填充也将归零。对于FP值,标准不保证归零(但在任何“正常”平台上都是如此;而且,由于您正在编写操作系统,您肯定知道在您的平台上“全零”FP值是否实际上为零)


第二个变量保证字段为零,但如果它影响填充,则未指定。如果您对填充的值不感兴趣,您可能应该使用这个选项-它更简洁,编译器也更清楚它的意图(因此它可能会更好地优化它)。

无论您如何操作,都必须在某个地方有一个循环……这是一个在编译器上使用的好技巧。对它说,“嘿,下面是什么?”也许我应该提到,我是在一个使用C99编译器的环境中编程的,它不支持memset/memcpy。但是在线程中,有人用兼容的类型转换方法来回答:mystruct=(struct x){0}@Orpedo:什么样的环境没有
memcpy
?@Orpedo:你确实记得
#include
,对吗?@Orpedo:这完全等同于我的“第二种方法”——语法创建一个临时的归零对象并将其分配给目标;在这里,我假设您想要初始化一个新的
结构
,以重置一个您想要在另一个问题中找到的语法的现有实例。