2010-08-13 18 views
0

gcc 4.4.4 c89premier paramètre dans memset passant array ou pointeur

Les pointeurs ne sont pas les mêmes que les points. Mais les tableaux peuvent se décomposer en pointeurs. J'utilisais juste memset dont le premier paramètre est un pointeur. Je voudrais initialiser mon tableau de structure.

-à-dire

struct devices 
{ 
    char name[STRING_SIZE]; 
    size_t profile; 
    char catagory; 
}; 

struct devices dev[NUM_DEVICES]; 

memset(dev, 0, (size_t)NUM_DEVICES * sizeof(*dev)); 

dev == & dev [0]

Mais dois-je passer le premier paramètre a ceci:

memset(&dev, 0, (size_t)NUM_DEVICES * sizeof(*dev)); 

Un grand merci pour tous les conseils,

+0

Je sais que ce n'est pas exactement votre question, mais si vous faites cela pour initialiser votre tableau de 'struct' vous devriez vraiment utiliser quelque chose comme' struct devices dev [NUM_DEVICES] = {{0}} ; 'ou mieux si vous avez C99' {{.name = ""}} 'sur le côté droit. –

Répondre

4

Ce que vous avez:

memset(dev, 0, (size_t)NUM_DEVICES * sizeof(*dev)); 

est bien - vous passez un pointeur sur le premier élément du tableau, et la taille du tableau. Cependant, la distribution (size_t) est inutile (sizeof est de type size_t, il fera la promotion correcte) et je trouve que dev[0] est plus claire que *dev dans ce cas:

memset(dev, 0, NUM_DEVICES * sizeof dev[0]); 

Alternativement, vous pouvez utiliser &dev comme l'adresse. Dans ce cas, il est probablement plus clair d'utiliser sizeof dev - la taille du tableau entier:

memset(&dev, 0, sizeof dev); 

je dis que cela est plus claire, car il est généralement préférable d'avoir le premier paramètre soit un pointeur vers le type qui est la sous réserve de sizeof dans le dernier paramètre: le memset() devrait ressembler à une de ces formes:

memset(p, ..., N * sizeof p[0]) 
memset(&x, ..., sizeof x) 

Notez cependant que ce dernier ne fonctionne que si dev est vraiment un tableau - comme il est dans ce cas. Si à la place vous avez un pointeur vers le premier élément du tableau, vous devrez utiliser la première version.

+0

+1 pour la dernière suggestion :-) – jweyrich

+0

'sizeof x' renvoie le nombre d'éléments du tableau uniquement si le tableau a été alloué statiquement. Ai-je raison? – DanSkeel

+0

@DanSkeel: Cela n'a rien à voir avec la durée de stockage statique - 'sizeof a' sera la taille du tableau' a' tant que 'a' est réellement un tableau (et qu'il a un type complet, c'est une erreur appliquer 'sizeof' à quelque chose avec un type incomplet). Notez que les pointeurs ne sont pas * des tableaux, et l'application de 'sizeof' à un pointeur vous donnera la taille du pointeur. Notez également que la taille d'un tableau n'est pas nécessairement le nombre d'éléments, c'est le nombre d'éléments multiplié par la taille de chaque élément. – caf