Malloc en C

Résolu/Fermé
bloodchecker Messages postés 339 Date d'inscription mercredi 2 juillet 2008 Statut Membre Dernière intervention 29 février 2012 - 4 mars 2010 à 14:48
fiddy Messages postés 11069 Date d'inscription samedi 5 mai 2007 Statut Contributeur Dernière intervention 23 avril 2022 - 4 mars 2010 à 21:56
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

12 réponses

fiddy Messages postés 11069 Date d'inscription samedi 5 mai 2007 Statut Contributeur Dernière intervention 23 avril 2022 1 844
4 mars 2010 à 21:55
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
UaLShark Messages postés 191 Date d'inscription vendredi 19 mai 2006 Statut Membre Dernière intervention 21 juillet 2010 35
4 mars 2010 à 14:50
tab = (char*) malloc(longueurChaine * sizeof(char));
0
bloodchecker Messages postés 339 Date d'inscription mercredi 2 juillet 2008 Statut Membre Dernière intervention 29 février 2012 35
4 mars 2010 à 14:54
ne fonctionne hélas pas.
0
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
UaLShark Messages postés 191 Date d'inscription vendredi 19 mai 2006 Statut Membre Dernière intervention 21 juillet 2010 35
4 mars 2010 à 14:58
c'est quoi l'erreur exactement?
vous avez fait #include <malloc.h> au debut?
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
bloodchecker Messages postés 339 Date d'inscription mercredi 2 juillet 2008 Statut Membre Dernière intervention 29 février 2012 35
4 mars 2010 à 15:02
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
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
UaLShark Messages postés 191 Date d'inscription vendredi 19 mai 2006 Statut Membre Dernière intervention 21 juillet 2010 35
4 mars 2010 à 15:10
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
fiddy Messages postés 11069 Date d'inscription samedi 5 mai 2007 Statut Contributeur Dernière intervention 23 avril 2022 1 844
4 mars 2010 à 21:56
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
bloodchecker Messages postés 339 Date d'inscription mercredi 2 juillet 2008 Statut Membre Dernière intervention 29 février 2012 35
4 mars 2010 à 15:17
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
bloodchecker Messages postés 339 Date d'inscription mercredi 2 juillet 2008 Statut Membre Dernière intervention 29 février 2012 35
4 mars 2010 à 15:21
J'ai trouvé ce tuto :
https://openclassrooms.com/fr/courses/19980-apprenez-a-programmer-en-c/16595-lallocation-dynamique#ss_part_3
Qui semble indiquer qu'un pointeur peut devenir un tableau ....
0
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
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
bloodchecker Messages postés 339 Date d'inscription mercredi 2 juillet 2008 Statut Membre Dernière intervention 29 février 2012 35
4 mars 2010 à 15:32
Merci pour votre aide.
0