struct x {
char a[10];
char b[20];
int i;
char *c;
char *d[10];
};
我正在填充此结构,然后使用这些值。在下一次迭代中,我想在开始重用之前将所有字段重置为0
或null
。
我该怎么做?我可以使用memset
或者我必须通过所有成员然后单独进行吗?
答案 0 :(得分:96)
使用初始值定义struct的const static实例,然后只要您想重置它,只需将此值赋给变量。
例如:
static const struct x EmptyStruct;
这里我依靠static initialization来设置我的初始值,但如果你想要不同的初始值,你可以使用struct初始化器。
然后,每次循环你都可以写:
myStructVariable = EmptyStruct;
答案 1 :(得分:76)
当你拥有现代C(C99)时,这样做的方法是使用复合文字。
a = (const struct x){ 0 };
这有点类似于David的解决方案,只是您不必担心声明空结构或是否声明它static
。如果你像我一样使用const
,编译器可以在适当的情况下在只读存储中静态分配复合文字。
答案 2 :(得分:51)
比上述所有内容更好地使用标准C规范进行结构初始化:
struct StructType structVar = {0};
以下是所有位零(永远)。
答案 3 :(得分:33)
在C中,使用struct
将memset
的内存清零是一种常见的习惯用法:
struct x myStruct;
memset(&myStruct, 0, sizeof(myStruct));
从技术上讲,我不相信这是可移植的,因为它假设机器上的NULL
指针由整数值0表示,但它被广泛使用,因为在大多数机器上都是这种情况。
如果从C转移到C ++,请注意不要在每个对象上使用此技术。 C ++只对没有成员函数且没有继承的对象进行合法化。
答案 4 :(得分:14)
如果您有符合C99标准的编译器,则可以使用
mystruct = (struct x){0};
否则你应该做David Heffernan所写的,即声明:
struct x empty = {0};
在循环中:
mystruct = empty;
答案 5 :(得分:5)
您可以使用memset
与结构的大小:
struct x x_instance;
memset (&x_instance, 0, sizeof(x_instance));
答案 6 :(得分:2)
我相信您可以将空集({}
)分配给您的变量。
struct x instance;
for(i = 0; i < n; i++) {
instance = {};
/* Do Calculations */
}
答案 7 :(得分:0)
struct x myX;
...
memset(&x, 0, sizeof(myX));
答案 8 :(得分:0)
或者如果您想在结构中使用API,可以这样做:
struct Register {
..
..
void reset() { *this = {}; }
..
}
因此稍后您可以执行以下操作:
Register reg;
// do some work
reg.reset()
答案 9 :(得分:0)
我向工作中的编译器工程师询问了哪个选项更好(memset 与 {0})。他没有给出我的意见,而是将我指向 Compiler Explorer。看看这三个选项是如何编译的很有趣:
https://godbolt.org/z/bPfKeG9Yh
这是代码的预览:
// Type your code here, or load an example.
#include "string.h"
struct MyStruct {
int age;
int sin;
char *name;
int cats;
char something[64];
};
const struct MyStruct empty_struct = {0};
int test() {
struct MyStruct blah = {0};
memset(&blah, 0, sizeof(blah));
blah = empty_struct;
blah.age = 99;
blah.sin = 123456789;
}
编译器根据结构体的成员类型对如何将内存归零做出不同的决定。例如,尝试注释掉 something
或选择非 x86 目标。
答案 10 :(得分:-1)
enter image description here对gnu11感到惊讶!
typedef struct {
uint8_t messType;
uint8_t ax; //axis
uint32_t position;
uint32_t velocity;
}TgotoData;
TgotoData tmpData = { 0 };
什么都不是零。