Инициализировать/reset struct to zero/null

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

Я заполняю эту структуру, а затем использую значения. На следующей итерации я хочу, чтобы reset все поля 0 или null, прежде чем я начну повторное использование.

Как я могу это сделать? Могу ли я использовать memset, или мне нужно пройти через все члены, а затем сделать это индивидуально?

Ответ 1

Определите константный статический экземпляр структуры с начальными значениями, а затем просто присвойте это значение вашей переменной всякий раз, когда вы хотите reset it.

Например:

static const struct x EmptyStruct;

Здесь я полагаюсь на статическую инициализацию для установки моих начальных значений, но вы можете использовать инициализатор структуры, если хотите разные начальные значения.

Затем, каждый раз по кругу вы можете написать:

myStructVariable = EmptyStruct;

Ответ 2

Способ сделать такую ​​вещь, когда у вас есть современный C (C99), - это использовать составной литерал.

a = (const struct x){ 0 };

Это несколько похоже на решение Дэвида, только вам не нужно беспокоиться, чтобы объявить пустую структуру или объявить ее static. Если вы используете const, как и я, компилятор может свободно размещать составной литерал в неподвижном хранилище, если это необходимо.

Ответ 3

Лучше, чем все выше, когда-либо использовать стандартную спецификацию C для инициализации структуры:

struct StructType structVar = {0};

Здесь все биты нуль (когда-либо).

Ответ 4

В C это общая идиома для обнуления памяти для struct с помощью memset:

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

С технической точки зрения, я не считаю, что это переносимо, потому что предполагается, что указатель NULL на машине представлен целочисленным значением 0, но он широко используется, потому что на большинстве машин это так.

Если вы перейдете с C на С++, будьте осторожны, чтобы не использовать эту технику для каждого объекта. С++ только делает это законным для объектов без функций-членов и без наследования.

Ответ 5

Если у вас есть компилятор, совместимый с C99, вы можете использовать

mystruct = (struct x){0};

иначе вы должны сделать то, что написал Дэвид Хеффернан, т.е. объявить:

struct x empty = {0};

И в цикле:

mystruct = empty;

Ответ 6

Вы можете использовать memset с размером структуры:

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

Ответ 7

Я считаю, что вы можете просто назначить пустой набор ({}) вашей переменной.

struct x instance;

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

Ответ 8

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

Ответ 9

Или, если вы хотите иметь API в своей структуре, вы можете сделать:

struct Register {
    ..
    ..
    void reset() { *this = {}; }
    ..
}

так что позже вы можете сделать это:

Register reg;
// do some work
reg.reset()