Langage c: malloc pointeur vers un pointeur??

Fermé
sassah - 18 juin 2011 à 15:34
fiddy Messages postés 11069 Date d'inscription samedi 5 mai 2007 Statut Contributeur Dernière intervention 23 avril 2022 - 19 juin 2011 à 11:28
Bonjour,

Il y a une écriture qui me dérange beaucoup car j'ai du mal à la comprendre lors d'une allocation dynamique de mémoire. Voici, une exemple:

int *nb; /*contiendra donc une adresse*/

/*on veut faire une allovation de mémoire vers nb*/

nb= (int*) malloc(3*size_of(int));


Voilà c'est lécriture de (int*) qui me dérange car je ne sais pas comment l'interpréter. nb contiendra une adresse c'est sûr, et dès le début on a dit qu'il contiendra une adresse ou sera/seront placé/és un/des int. Ici ce sera un tableau de int. Alors pourquoi préciser encore le (int*) en debut du malloc?

ou bien est-ce-que cela veut dire que nb contiendra une adresse qui contiendra aussi une adresse? S'il vous plait aidez moi dans ma compréhension. Je suis en plein révision et tant qu'une chose n'est pas claire pour moi je ne peux pas avancer.

Merci d'avance.



A voir également:

3 réponses

Personne? Je vous en prie, ça me torture l'esprit. Pourquoi fait on une conversion explicite alors qu'on sait que nb est un tableau qui contiendra des adresses contenant des int ??

Please please please!!!
0
fiddy Messages postés 11069 Date d'inscription samedi 5 mai 2007 Statut Contributeur Dernière intervention 23 avril 2022 1 842
18 juin 2011 à 18:03
Bonjour sassah,

Un peu de patience est la bienvenue...

Pour la question, ce n'est pas par rapport au type de la variable "nb" qu'il faut se reporter, mais au type du retour de la fonction malloc (void *).

Le pointeur générique void* sera converti automatiquement en int*. Le cast est donc superflu. Par ailleurs, il vaut même mieux le retirer puisque dans certaine version de compilateur, il masque l'erreur fréquente qui consiste à oublier "#include <stdlib.h>".

Alors pourquoi on le met ? Car historiquement (en C K&R), malloc retournait un char* et la conversion nécessitait le cast. Depuis ce temps, certains ont pris l'habitude de le laisser, d'autres se sont mis à jour des normes ISO. En tout cas, le cast n'apporte absolument rien.

Cdlt,
0
Merci pour la réponse.
Un prof m'a dit que, contrairement à ce que tu as dit, le fait de mettre cette conversion explicite permet de détecter facilement les erreurs. Ce qui fait que dans certains cas, comme par exemple pour allouer de la mémoire à une variable de type struct, souvent on le fait.
Je ne sais pas vraiment laquelle prendre parmi vos réponses.

En tout cas, je sais donc que avec ou sans ne change en (presque) rien le but de l'instruction.
0
fiddy Messages postés 11069 Date d'inscription samedi 5 mai 2007 Statut Contributeur Dernière intervention 23 avril 2022 1 842
Modifié par fiddy le 19/06/2011 à 11:33
Beaucoup de prof ont appris le C K&R et ne sont malheureusement pas à jour avec la norme ISO...
Le type de malloc est void* et cela assure automatiquement le cast. Il est de fait facultatif.
Avec ou sans, ça ne change rien du tout. Même s'il est conseillé de ne pas le mettre. Mais après, le mieux est soit de convaincre sa prof, soit de l'écouter car c'est elle qui te note après tout ^^.
0