将struct初始化/重置为零/ null

时间:2011-07-31 19:20:33

标签: c struct initialization

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

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

我该怎么做?我可以使用memset或者我必须通过所有成员然后单独进行吗?

11 个答案:

答案 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中,使用structmemset的内存清零是一种常见的习惯用法:

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 };

什么都不是零。