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 0
o null
antes de comenzar a reutilizarlos.
¿Cómo puedo hacer eso? ¿Puedo usar memset
o tengo que pasar por todos los miembros y luego hacerlo individualmente?
c
struct
initialization
hari
fuente
fuente
memset
si solo quiero restablecer todo a0
?memset
me hace sentir sucio. Prefiero dejar que el compilador se preocupe por el diseño de la memoria siempre que sea posible. Estrictamente hablando, dicho usomemset
no es portátil, pero en la práctica me sorprendería si alguna vez compilaras tu código en cualquier lugar que importara. Por lo tanto, es probable que pueda usar Memset de forma segura si lo prefiere.La forma de hacer tal cosa cuando tiene C (C99) moderno es usar un literal compuesto .
Esto es algo similar a la solución de David, solo que no tiene que preocuparse por declarar una estructura vacía o si declararla
static
. Si usa elconst
como yo lo hice, el compilador es libre de asignar el literal compuesto de forma estática en el almacenamiento de solo lectura si corresponde.fuente
{ 0 }
como inicializador predeterminado. Apague esa advertencia, es falsa falsa alarma.Mejor que todo lo anterior es usar la especificación C estándar para la inicialización de la estructura:
Aquí están todos los bits cero (siempre).
fuente
{}
en C ++. Los desarrolladores de gcc parecen no{0}
estar seguros de si se supone que C ++ es compatible y no estoy familiarizado con esa parte del estándar.{0}
o{}
. No estoy seguro si los estándares de C & C ++ son claros y sincronizados en este tema, pero aparentemente, los compiladores no lo son.struct StructType structVar = malloc (sizeof(StructType)); structVar ={0}
En C, es un modismo común poner a cero la memoria para un
struct
usomemset
:Técnicamente hablando, no creo que esto sea portátil porque asume que el
NULL
puntero 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 pasa de C a C ++, tenga cuidado de no utilizar esta técnica en todos los objetos. C ++ solo hace que esto sea legal en objetos sin funciones miembro y sin herencia.
fuente
Si tiene un compilador compatible con C99, puede usar
de lo contrario, debería hacer lo que escribió David Heffernan, es decir, declarar:
Y en el bucle:
fuente
Puede usar
memset
con el tamaño de la estructura:fuente
memset
es una opción, pero al usarla, debe asegurarse de que la memoria en la que se escribe sea exactamente del mismo tamaño que el tercer parámetro, por eso es mejor referirse al tamaño del objeto real, no al tamaño del tipo que sé que lo es actualmente . IOWmemset (&x_instance, 0, sizeof(x_instance));
es una opción mucho mejor. Por cierto: el(void*)
elenco es superfluo en C ++ también.Creo que puede simplemente asignar el conjunto vacío (
{}
) a su variable.fuente
fuente
ingrese la descripción de la imagen aquí ¡ Tome una sorpresa de gnu11!
nada es cero.
fuente