Inicializando una matriz de estructura usando memset
(4)
Hay un error tipográfico en su código. Fijar:
memset(dev_sys, 0, (size_t)NUM_DEVICES * sizeof(struct device_sys));
Escoger buenos nombres evita la mitad de los bichos. Yo recomendaría "dispositivos".
gcc 4.4.4 c89
Tengo la siguiente estructura.
struct device_sys
{
char device[STRING_SIZE];
int id;
char category;
};
int main(void)
{
struct device_sys dev_sys[NUM_DEVICES];
memset(dev_sys, 0, (size_t)NUM_DEVICES * sizeof(dev_sys));
return 0;
}
Recibo un volcado de pila cuando llamo a memset. ¿No es esta la forma correcta de inicializar una matriz de estructura?
Para una matriz, sizeof
obtiene el tamaño completo de la matriz, no el tamaño de un elemento individual. El operador sizeof
es uno de los pocos lugares donde una matriz no se trata como un puntero a su primer elemento.
Tienes que pasar el operador sizeof
tipo y no la variable.
memset(dev_sys, 0, (size_t)NUM_DEVICES * sizeof(struct device_sys));
Prefiero usar typedef
para la estructura.
typedef struct tag_device_sys
{
char device[STRING_SIZE];
int id;
char category;
} device_sys;
Puedes usar memset
siguiente manera:
memset(dev_sys, 0, (size_t)NUM_DEVICES * sizeof(device_sys));
Ya sea
memset(&dev_sys, 0, sizeof dev_sys);
o
memset(dev_sys, 0, NUM_DEVICES * sizeof(struct device_sys));
O si prefieres
memset(dev_sys, 0, NUM_DEVICES * sizeof *dev_sys);
Pero no es lo que tienes en tu variante original.
Tenga en cuenta que, en su caso específico, en todas las variantes, puede usar &dev_sys
o dev_sys
como primer argumento. El efecto será el mismo. Sin embargo, &dev_sys
es más apropiado en la primera variante, ya que si sigue el memset(ptr-to-object, object-size)
. En la segunda y tercera variantes es más apropiado usar dev_sys
(o &dev_sys[0]
), ya que sigue el memset(ptr-to-first-element, number-of-elements * element-size)
.
PD: Por supuesto, en lugar de utilizar todos esos trucos memset
, en su caso particular, debería haber declarado su matriz con un inicializador.
struct device_sys dev_sys[NUM_DEVICES] = { 0 };
No memset
necesario.