Инициализировать / сбросить структуру на ноль / ноль - PullRequest
82 голосов
/ 31 июля 2011
struct x {
    char a[10];
    char b[20];
    int i;
    char *c;
    char *d[10];
};

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

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

Ответы [ 9 ]

97 голосов
/ 31 июля 2011

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

Например:

static const struct x EmptyStruct;

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

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

myStructVariable = EmptyStruct;
77 голосов
/ 01 августа 2011

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

a = (const struct x){ 0 };

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

51 голосов
/ 31 июля 2011

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

struct StructType structVar = {0};

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

33 голосов
/ 31 июля 2011

В C это обычная идиома обнуление памяти для struct с использованием memset:

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

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

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

14 голосов
/ 01 августа 2011

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

mystruct = (struct x){0};

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

struct x empty = {0};

И в цикле:

mystruct = empty;
5 голосов
/ 31 июля 2011

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

struct x x_instance;
memset (&x_instance, 0, sizeof(x_instance));
3 голосов
/ 28 мая 2017

Полагаю, вы можете просто присвоить пустой переменной ({}) свою переменную.

struct x instance;

for(i = 0; i < n; i++) {
    instance = {};
    /* Do Calculations */
}
0 голосов
/ 17 июля 2019

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

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

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

Register reg;
// do some work
reg.reset()
0 голосов
/ 31 июля 2011
 struct x myX;
 ...
 memset(&x, 0, sizeof(myX));
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...