inicializar funciones estructuras con arreglo anidadas c struct initialization

arreglo - funciones con estructuras en c



Inicializar/restablecer struct a cero/nulo (8)

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

Estoy llenando esta estructura y luego usando los valores. En la próxima iteración, quiero restablecer todos los campos a 0 o null antes de comenzar a reutilizarlo.

¿Cómo puedo hacer eso? ¿Puedo usar memset o tengo que pasar por todos los miembros y luego hacerlo individualmente?


Creo que puedes asignar el conjunto vacío ( {} ) a tu variable.

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


Defina una instancia estática const de la estructura con los valores iniciales y luego simplemente asigne este valor a su variable siempre que quiera restablecerla.

Por ejemplo:

static const struct x EmptyStruct;

Aquí estoy confiando en la inicialización estática para establecer mis valores iniciales, pero podría usar un inicializador de estructuras si desea valores iniciales diferentes.

Luego, cada vez que pasa el ciclo puede escribir:

myStructVariable = EmptyStruct;


En C, es una expresión común poner a cero la memoria de una struct usando memset :

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

Técnicamente hablando, no creo que esto sea portátil porque supone que el puntero NULL en una máquina está representado por el valor entero 0, pero se usa ampliamente porque en la mayoría de las máquinas este es el caso.

Si te mueves de C a C ++, ten cuidado de no usar esta técnica en cada objeto. C ++ solo lo hace legal en objetos sin funciones miembro y sin herencia.


La manera de hacer algo así cuando tienes C moderno (C99) es usar un literal compuesto .

a = (const struct x){ 0 };

Esto es algo similar a la solución de David, solo que no tiene que preocuparse por declarar una estructura vacía o declararla static . Si utiliza el const como lo hice, el compilador puede asignar literalmente el compuesto literal de forma estática en el almacenamiento de solo lectura, si corresponde.


Mejor que todo lo anterior es usar la especificación estándar C para la inicialización de estructuras:

struct StructType structVar = {0};

Aquí están todos los bits cero (alguna vez).


Puede usar memset con el tamaño de la estructura:

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


Si tiene un compilador compatible con C99, puede usar

mystruct = (struct x){0};

de lo contrario, debe hacer lo que David Heffernan escribió, es decir, declarar:

struct x empty = {0};

Y en el ciclo:

mystruct = empty;


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