web-dev-qa-db-fra.com

initialisation d'un tableau de structure à l'aide de memset

gcc 4.4.4 c89

J'ai la structure suivante.

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; 
}

J'obtiens un vidage de pile lorsque j'appelle memset. N'est-ce pas la bonne façon d'initialiser un tableau de structure?

18
ant2009

Soit

memset(&dev_sys, 0, sizeof dev_sys);

ou

memset(dev_sys, 0, NUM_DEVICES * sizeof(struct device_sys));

Ou, si vous préférez

memset(dev_sys, 0, NUM_DEVICES * sizeof *dev_sys);

mais pas ce que vous avez dans votre variante d'origine.

Notez que dans votre cas spécifique dans toutes les variantes, vous pouvez utiliser soit &dev_sys Soit dev_sys Comme premier argument. L'effet sera le même. Cependant, &dev_sys Est plus approprié dans la première variante, car si suit l'idiome memset(ptr-to-object, object-size). Dans les deuxième et troisième variantes, il est plus approprié d'utiliser dev_sys (Ou &dev_sys[0]), Car il suit l'idiome memset(ptr-to-first-element, number-of-elements * element-size).

P.S. Bien sûr, au lieu d'utiliser toute cette ruse memset hackish, dans votre cas particulier, vous devriez juste déclarer votre tableau avec un initialiseur

struct device_sys dev_sys[NUM_DEVICES] = { 0 };

Aucun memset nécessaire.

34
AnT

Il y a une faute de frappe dans votre code. Réparer:

memset(dev_sys, 0, (size_t)NUM_DEVICES * sizeof(struct device_sys));

Choisir de bons noms évite la moitié des bugs. Je recommanderais des "appareils".

9
Hans Passant

Pour un tableau, sizeof vous donne la taille entière du tableau, pas la taille d'un élément individuel. L'opérateur sizeof est l'un des rares endroits où un tableau n'est pas traité comme un pointeur sur son premier élément.

1
Thom Smith

Vous devez passer l'opérateur sizeof le type et non la variable.

memset(dev_sys, 0, (size_t)NUM_DEVICES * sizeof(struct device_sys));

Je préfère utiliser typedef pour la structure.

typedef struct tag_device_sys
{
    char device[STRING_SIZE];
    int id;
    char category;
} device_sys;

Vous pouvez utiliser memset comme suit:

    memset(dev_sys, 0, (size_t)NUM_DEVICES * sizeof(device_sys));
1
Lucas