初始化/重置结构为零/ null
struct x { char a[10]; char b[20]; int i; char *c; char *d[10]; };
我正在填充此结构,然后使用值。 在下一次迭代中,我想重置所有的字段为0
或null
然后再开始重用它。
我怎样才能做到这一点? 我可以使用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 */ }