2011-11-15 5 views
0

Que signifie cette instruction?calloc typecasting pour pointer vers le pointeur

//allocated memory for Device info 

(*PppsCoreStructure)->psDeviceDetails=(sDeviceDetails **)calloc(CORE_DEVICEINFO_SIZE, sizeof(sDeviceDetails*)); 

Je sais que '(* PppsCoreStructure) -> psDeviceDetails' est un pointeur vers pointeur. Mais je ne suis pas capable d'imaginer comment calloc peut renvoyer le pointeur vers le pointeur? Je suis un débutant s'il vous plaît aider

Répondre

1
  • (*PppsCoreStructure)->psDeviceDetails est déclarée avec le type sDeviceDetails **
  • La valeur de retour de calloc() est de type void*
  • (sDeviceDetails **)calloc(...) jette la valeur de retour de calloc être de type sDeviceDetails **

Dans le langage C++ cette le cast de type est essentiel, bien qu'en C++ on n'utiliserait normalement pas calloc et utiliserait probablement des casts C++.

En langage C, la conversion de type n'est pas nécessaire car un pointeur void* est compatible avec tous les autres types de pointeurs.


Dans un commentaire, vous déclarez

Mais je veux savoir comment sDeviceDetails* est différent de sDeviceDetails**

et je pense que cela est en fait votre vraie question.

La réponse est assez simple: T* est un pointeur-à-T et T** est un pointeur-à-pointeur-à-T.

+0

Je veux dire, comme je le sais, calloc/malloc crée un nouvel espace et renvoie son adresse à un pointeur. Donc T * est correct. J'ai compris. Mais pour T **, calloc/malloc devrait créer un nouvel espace, l'assigner à un pointeur. Et encore, l'adresse de ce pointeur sera assignée à T **. Ce que je pensais être correct? Si c'est correct, qu'en est-il de ce pointeur central? – SHRI

+1

@SHRI Votre appel à 'calloc' alloue uniquement le tableau de pointeurs. Vous devez ensuite allouer chaque pointeur dans ce tableau. –

+0

Merci beaucoup. – SHRI

3

Cet appel à calloc alloue suffisamment d'espace pour CORE_DEVICEINFO_SIZE pointeurs à sDeviceDetails objets. calloc renvoie un tampon mémoire simple pouvant être utilisé pour stocker n'importe quoi; dans ce cas, des pointeurs.

(Notez que se fondant sur calloc pour retourner des tampons remplis de pointeurs NULL n'est pas portable: elle retourne des tampons remplis de zéro, mais le pointeur NULL est pas nécessairement tous les zéros Il est sur des plateformes communes, bien que..)

+0

Merci pour votre réponse Monsieur, mais je veux savoir comment (sDeviceDetails *) calloc est différent de (sDeviceDetails **) calloc. – SHRI

+0

@SHRI: comme je l'ai expliqué, 'calloc' est utilisé ici pour allouer de l'espace pour les pointeurs sur' sDeviceDetails'. Vous utiliseriez une distribution 'sDeviceDetails *' lors de l'allocation d'espace pour un 'struct sDeviceDetails', ou un tableau de ceux-ci. –

+0

'(sDeviceDetails *) calloc (...)' requiert que 'sDeviceDetails' soit un type tableau ou pointeur (ou que vous ayez seulement demandé à' calloc' un seul élément - CORE_DEVICEINFO_SIZE = 1). Parce que 'calloc' alloue plusieurs blocs séquentiels de mémoire, ses valeurs de retour sont des pointeurs vers des pointeurs de la même façon que les pointeurs vers des tableaux sont comme des pointeurs vers des pointeurs – tobyodavies

3

La fonction alloue un tableau de pointeurs. CORE_DEVICEINFO_SIZE est le nombre de pointeurs dans ce tableau. (SDeviceDetails **) signifie que le programmeur qui a écrit le code ne sait pas comment les distributions void-pointer fonctionnent dans le langage C. La distribution est redondante et doit être supprimée.

+0

Désolé, pourquoi est-il redondant d'arrêter les avertissements du compilateur?Cela rend les vrais avertissements possibles de ne pas voir? – tobyodavies

+2

Ce type de message supprime _ les véritables avertissements, par exemple si vous tentez accidentellement de stocker un pointeur vers un pointeur à l'intérieur d'un pointeur. C'est pourquoi c'est une mauvaise pratique. (C++ est une autre affaire, mais cette question est à propos de C.) [Lire un certain nombre de messages à ce sujet sur SO] (http://stackoverflow.com/questions/4993327/is-typecast-required-in-malloc) – Lundin

+1

vous apprendre quelque chose tous les jours. Ça fait trop longtemps que j'ai utilisé C sérieusement ... – tobyodavies

Questions connexes