Инициализация / сброс структуры до нуля / null
struct x {
char a[10];
char b[20];
int i;
char *c;
char *d[10];
};
я заполняю эту структуру, а затем использую значения. На следующей итерации, я хочу сбросить все поля 0 или null прежде чем я начну использовать его повторно.
как я могу это сделать? Могу ли я использовать memset или мне придется пройти через все члены, а затем сделать это индивидуально?
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 */ }
Comments