Question à propos d'un tuto

lulz -  
totof31 Messages postés 165 Statut Membre -
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.

2 réponses

  1. 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
    1. fiddy Messages postés 441 Date d'inscription   Statut Contributeur Dernière intervention   1 847
       
      Voire même scanf("%49s", donnee); ;-)
      0
  2. totof31 Messages postés 165 Statut Membre 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
    1. fiddy Messages postés 441 Date d'inscription   Statut Contributeur Dernière intervention   1 847
       
      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
    2. totof31 Messages postés 165 Statut Membre 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