初始化/重置结构为零/ null

struct x { char a[10]; char b[20]; int i; char *c; char *d[10]; }; 

我正在填充此结构,然后使用值。 在下一次迭代中,我想重置所有的字段为0null然后再开始重用它。

我怎样才能做到这一点? 我可以使用memset或者我必须通过所有的成员,然后单独做?

使用初始值定义结构的const静态实例,然后只要将其重置,就将该值赋给variables。

例如:

 static const struct x EmptyStruct; 

在这里,我依靠静态初始化来设置我的初始值,但是如果你想要不同的初始值,你可以使用一个结构初始值设定项。

然后,每次循环你可以写:

 myStructVariable = EmptyStruct; 

当你有现代C(C99)时,做这样的事情的方法是使用复合文字

 a = (const struct x){ 0 }; 

这有点类似于David的解决scheme,只是你不必担心声明一个空的结构或是否声明它是static 。 如果像我一样使用const ,则编译器可以自由地将复合文本静态分配到只读存储中(如果适用)。

比以上所有更好的是使用标准C规范进行结构体初始化:

 struct StructType structVar = {0}; 

这里都是零(永远)。

在C语言中,使用memset为一个struct memset内存是一个常见的习惯用法:

 struct x myStruct; memset(&myStruct, 0, sizeof(myStruct)); 

从技术上讲,我不认为这是可移植的,因为它假定机器上的NULL指针是用整数值0表示的,但是它被广泛使用,因为在大多数机器上是这种情况。

如果你从C移到C ++,注意不要在每个对象上使用这个技巧。 C ++只能在没有成员函数和inheritance的对象上合法化。

如果你有一个C99兼容的编译器,你可以使用

 mystruct = (struct x){0}; 

否则你应该做David Heffernan写的,即声明:

 struct x empty = {0}; 

在循环中:

 mystruct = empty; 

您可以使用结构体大小的memset

 struct x x_instance; memset (&x_instance, 0, sizeof(x_instance)); 
  struct x myX; ... memset(&x, 0, sizeof(myX)); 

我相信你可以将空集( {} )分配给你的variables。

 struct x instance; for(i = 0; i < n; i++) { instance = {}; /* Do Calculations */ }