Инициализация / сброс структуры до нуля / null



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


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



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

613   8  

8 ответов:

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

например:

static const struct x EmptyStruct;

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

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

myStructVariable = EmptyStruct;

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

a = (const struct x){ 0 };

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

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

struct StructType structVar = {0};

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

В C, это общая идиома, чтобы обнулить память для A struct С помощью memset:

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

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

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

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

mystruct = (struct x){0};

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

struct x empty = {0};

и в цикле:

mystruct = empty;

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

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

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

struct x instance;

for(i = 0; i < n; i++) {
    instance = {};
    /* Do Calculations */
}
 struct x myX;
 ...
 memset(&x, 0, sizeof(myX));

Comments

    Ничего не найдено.