Question à propos d'un tuto

lulz -  
totof31 Messages postés 163 Date d'inscription   Statut Membre Dernière intervention   -
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   Statut Membre Dernière intervention   54
 
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   Statut Contributeur Dernière intervention   1 846
 
Voire même scanf("%49s", donnee); ;-)
0
totof31 Messages postés 163 Date d'inscription   Statut Membre Dernière intervention   74
 
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   Statut Contributeur Dernière intervention   1 846
 
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   Statut Membre Dernière intervention   74
 
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