技巧C编译器将整个结构赋值为零,而不使用for循环
我目前正在编写嵌入式操作系统的一小部分,有时需要将大型结构中的所有变量赋值为0。元素范围从uint8到uint64。 到目前为止,我唯一要做的就是循环遍历每种类型的变量,将每种类型的变量赋值为0,但这需要很多周期,而且代码“难看”。 我在想,是否可以创建一个结构类型的指针,然后将指针元素的值赋给0,因为该元素的大小应该是sizeof(MyStruct) 要分配给0的结构:技巧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
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};
第二个变量保证字段为零,但如果它影响填充,则未指定。如果您对填充的值不感兴趣,您可能应该使用这个选项-它更简洁,编译器也更清楚它的意图(因此它可能会更好地优化它)。无论您如何操作,都必须在某个地方有一个循环……这是一个在编译器上使用的好技巧。对它说,“嘿,下面是什么?”也许我应该提到,我是在一个使用C99编译器的环境中编程的,它不支持memset/memcpy。但是在线程中,有人用兼容的类型转换方法来回答:mystruct=(struct x){0}@Orpedo:什么样的环境没有
memcpy
?@Orpedo:你确实记得#include
,对吗?@Orpedo:这完全等同于我的“第二种方法”——语法创建一个临时的归零对象并将其分配给目标;在这里,我假设您想要初始化一个新的结构
,以重置一个您想要在另一个问题中找到的语法的现有实例。