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?
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.
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".
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.
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));