Question à propos d'un tuto

Fermé
lulz - 18 nov. 2012 à 11:21
totof31 Messages postés 163 Date d'inscription lundi 29 octobre 2012 Statut Membre Dernière intervention 30 avril 2013 - 22 nov. 2012 à 23:02
Bonjour,
J'ai une petite quesiton a propos du tuto qui traite des liste simplement chainées: http://www.commentcamarche.net/faq/7444-liste-simplement-chainee

Dans la definition de la structure :
typedef struct ElementListe {
char *donnee;
struct ElementListe *suivant;
}Element;

Pourquoi, un pointeur est-il utilisé et non pas juste une chaine de caractere ?

Et dans les fonction, avant les instructions, il y une verification de l'allocation et en ce qui concerne la chaine de caractere, l'allocation est la suivante
if ((nouveau_element->donnee = (char *) malloc (50 * sizeof (char)))
== NULL)

Je ne comprends pas vraiment comment, en déclarant un pointeur(qui ne reserve pas de mémoire) on peut donner une valeur a cette variable (par un scanf("%d",donnee);)

Merci d'avoir lu ce message.
A voir également:

2 réponses

Hxyp Messages postés 401 Date d'inscription vendredi 28 janvier 2011 Statut Membre Dernière intervention 27 avril 2014 54
Modifié par Hxyp le 19/11/2012 à 18:21
Bonjour,
«Pourquoi, un pointeur est-il utilisé et non pas juste une chaine de caractere ?»
char *donnee;

on peut placer une adresse dans la variable donnee, une adresse retournée par un malloc ou calloc (ou autre...) qui permet donc de pointer sur un bloc de bytes pouvant servir de tableau de char pour contenir une chaîne de caractères.

if ((nouveau_element->donnee = (char *) malloc (50 * sizeof (char)))  
 == NULL)

Comme je l'ai dis au dessus la variable donnee peut recevoir une adresse. Ici on peut voir qu'elle reçoit une adresse du début d'un bloc de taille 50 char, donnee pointe alors sur un "tableau" de 50 char en mémoire. On peut l'utiliser comme si c'était un :
char donnee[50];

Le scanf serait possible, un truc dans le genre :
scanf("%50s",donnee);
0
fiddy Messages postés 11069 Date d'inscription samedi 5 mai 2007 Statut Contributeur Dernière intervention 23 avril 2022 1 843
19 nov. 2012 à 19:46
Voire même scanf("%49s", donnee); ;-)
0
totof31 Messages postés 163 Date d'inscription lundi 29 octobre 2012 Statut Membre Dernière intervention 30 avril 2013 74
22 nov. 2012 à 08:34
Pour être parfaitement générique, on aurait pu remplacer
char *donnee;
par
void *donnee;

Ainsi, grâce à malloc, on alloue en fonction du besoin la place nécessaire, qui peut être comme ici une chaine de caractère, ou un entier, un flottant, un tableau de ce qu'on veut, ou une structure complexe, ou un tableau de structure, etc.
0
fiddy Messages postés 11069 Date d'inscription samedi 5 mai 2007 Statut Contributeur Dernière intervention 23 avril 2022 1 843
22 nov. 2012 à 20:18
Avec un char* donnee, tu peux très bien utiliser malloc sans cast vu que malloc retourne déjà un void*.
Ou alors j'ai pas compris ce que tu voulais dire...
0
totof31 Messages postés 163 Date d'inscription lundi 29 octobre 2012 Statut Membre Dernière intervention 30 avril 2013 74
22 nov. 2012 à 23:02
Oui, on peut très bien utiliser un pointeur de ce qu'on veut d'ailleurs.
Ce que j'essayai de faire comprendre (très maladroitement, je m'en accuse), c'était le caractère abstrait de la chose : une liste chainée peut concerner n'importe quel type de données... et réciproquement, quand on écrit du code générique on utilise plutôt void *
Ai-je été plus clair ? Ou je m'embrouille encore ?...
0