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()