har*_*ari 86 c struct initialization
struct x {
char a[10];
char b[20];
int i;
char *c;
char *d[10];
};
Run Code Online (Sandbox Code Playgroud)
我正在填充此结构,然后使用值.在下一次迭代中,我想在重新开始重用之前0
或null
之前重置所有字段.
我怎样才能做到这一点?我可以使用memset
或者必须通过所有成员然后单独进行吗?
Dav*_*nan 100
使用初始值定义struct的const静态实例,然后只要您想重置它,就可以将此值分配给变量.
例如:
static const struct x EmptyStruct;
Run Code Online (Sandbox Code Playgroud)
这里我依靠静态初始化来设置我的初始值,但如果你想要不同的初始值,你可以使用struct初始化器.
然后,每次循环你都可以写:
myStructVariable = EmptyStruct;
Run Code Online (Sandbox Code Playgroud)
Jen*_*edt 80
当你有现代C(C99)时,做这样的事情的方法是使用复合文字.
a = (const struct x){ 0 };
Run Code Online (Sandbox Code Playgroud)
这有点类似于David的解决方案,只是您不必担心声明空结构或是否声明它static
.如果你const
按照我的方式使用,编译器可以自由地在只读存储中静态分配复合文字.
use*_*313 54
比以上所有更好的是使用标准C规范进行结构初始化:
struct StructType structVar = {0};
Run Code Online (Sandbox Code Playgroud)
这里都是零(永远).
tem*_*def 33
在C中,将struct
使用的内存清零是一种常见的习惯用法memset
:
struct x myStruct;
memset(&myStruct, 0, sizeof(myStruct));
Run Code Online (Sandbox Code Playgroud)
从技术上讲,我不相信这是可移植的,因为它假设NULL
机器上的指针由整数值0表示,但它被广泛使用,因为在大多数机器上都是这种情况.
如果从C迁移到C++,请注意不要在每个对象上使用此技术.C++仅对没有成员函数且没有继承的对象具有合法性.
Rud*_*uis 17
如果您有符合C99标准的编译器,则可以使用
mystruct = (struct x){0};
Run Code Online (Sandbox Code Playgroud)
否则你应该做David Heffernan所写的,即声明:
struct x empty = {0};
Run Code Online (Sandbox Code Playgroud)
在循环中:
mystruct = empty;
Run Code Online (Sandbox Code Playgroud)
您可以使用memset
结构的大小:
struct x x_instance;
memset (&x_instance, 0, sizeof(x_instance));
Run Code Online (Sandbox Code Playgroud)