c memset

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.