Malloc en C

Résolu
bloodchecker Messages postés 361 Statut Membre -  
fiddy Messages postés 441 Date d'inscription   Statut Contributeur Dernière intervention   -
Bonjour,
Je ne comprend pas pourquoi je peut déclarer tab de la premiere façon et pas de la seconde. Sachant que le première façon ne marche pas avec le C 89 j'aimerai savoir ce qui cloche dans la seconde.

char tab[longueurChaine];

char *tab
tab = malloc(longueurChaine * sizeof(char));

Merci
Configuration: Debian - Windows 7/XP
Wamp

12 réponses

  1. fiddy Messages postés 441 Date d'inscription   Statut Contributeur Dernière intervention   1 847
     
    Bonjour,

    char tab[longueurChaine];
    Cette instruction ne marche qu'en C99 si longueurChaine est une variable. S'il s'agit d'une macro (en général on met en majuscule), cela marchera en Ansi.

    char *tab;
    tab = malloc(longueurChaine * sizeof(char));

    Pas besoin de caster avec (char*) contrairement à ce qu'il a été dit plus haut.
    Ceci doit fonctionner. Pas besoin de mettre le sizeof(char), il vaut toujours 1.
    En tout cas, cette instruction est bien correcte. Mais tu auras pas un tableau. Tu auras un pointeur sur une zone allouée dans le tas de longueurChaine bytes (et non octets). Il convient donc également de la libérer avec un free avant la fin de la portée du pointeur. Ainsi sizeof tab vaudra sizeof(char*) et non longueurChaine. Mais la notation tab[i] fonctionnera de même que pour un vrai tableau. Et lorsque tu en verras tab en paramètre d'une fonction, cela sera exactement pareil que si tu envoyais un véritable tableau en paramètre.

    Voilou, si tu veux plus de précisions. N'hésite pas.

    Cdlt,
    1
  2. UaLShark Messages postés 193 Statut Membre 35
     
    tab = (char*) malloc(longueurChaine * sizeof(char));
    0
    1. bloodchecker Messages postés 361 Statut Membre 35
       
      ne fonctionne hélas pas.
      0
  3. le père
     
    Qu'entends-tu par "ne fonctionne pas" ?

    Si tu as un message d'erreur à la compilation, il vient peut-être du ; qui manque à la fin de la ligne précédente :

    char *tab ;
    0
  4. UaLShark Messages postés 193 Statut Membre 35
     
    c'est quoi l'erreur exactement?
    vous avez fait #include <malloc.h> au debut?
    0
  5. Vous n’avez pas trouvé la réponse que vous recherchez ?

    Posez votre question
  6. bloodchecker Messages postés 361 Statut Membre 35
     
    L'erreur est que l'espace mémoire alloué n'est pas celui voulu. Sachant que quand j'affiche longueurChaine * sizeof(char) j'obtient par exemple 8, et bien si j'affiche ensuite sizeof(tab) j'ai systématiquement 4.
    Je n'ai pas inclu malloc.h mais j'ai déjà un malloc qui fonctionne parfaitement dans mon code donc je ne pense pas que ca vienne de la :/
    0
  7. le père
     
    Normal que tu aies 4,
    tab défini de la seconde manière est un pointeur, pas un tableau. Et la taille d'un pointeur est de 4 avec ton compilateur, quelle que soit la taille allouée.
    Il faut que tu retournes à tes cours de C pour revoir qu'un pointeur et un tableau n'ont pas grand rapport
    0
  8. UaLShark Messages postés 193 Statut Membre 35
     
    Comme a dit le père
    longueurChaine * sizeof(char) = 8 (votre pointeur pointe vers une zone de 8 octets)
    taille du tableau = 4 (4 chars => votre OS code le char sur 2 octets et pas sur 1 (ceux sont pas des WILD char))
    0
    1. fiddy Messages postés 441 Date d'inscription   Statut Contributeur Dernière intervention   1 847
       
      Non.
      Un char est codé sur un byte. Pas sur deux.
      Si la taille du tableau fait 4 c'est car c'est la taille d'une adresse mémoire et non du tableau.

      Cdlt,
      0
  9. bloodchecker Messages postés 361 Statut Membre 35
     
    Ok ok. Dans ce cas comment puis-je allouer la taille de mon tableau dynamiquement ?
    Parce que ma première manière ne fonctionne pas en C 89.
    0
  10. le père
     
    La seconde manière est très bien. Tu obtiens bien un tableau de la taille que tu veux, mais il faut juste savoir que tab n'est PAS le tableau lui-même, mais un pointeur sur le tableau.
    Alors qu'avec la première syntaxe, tab désignait bien le tableau.
    0
  11. le père
     
    Je viens de voir le lien que tu as mis sur le site du zéro mais je ne vais pas voir ce qu'il y a sur ton lien.
    S'il y a des similitudes dans l'écriture quand tu utilises un tableau et un pointeur, ce sont quand même deux notions complètement différentes, tant en théorie qu'en pratique. Leurs ressemblances sont une source de confusion permanente.
    Le tableau est un "paquet" de variables
    Le pointeur est une variable unique (je ne parle pas de tableaux de pointeurs...) qui contient l'adresse d'autre chose. La confusion, c'est qu'on s'en sert souvent pour contenir l'adresse d'un tableau, mais ceci ne transforme pas le pointeur en tableau !
    0
  12. bloodchecker Messages postés 361 Statut Membre 35
     
    Merci pour votre aide.
    0