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
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
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
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,
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,
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
4 mars 2010 à 14:50
tab = (char*) malloc(longueurChaine * sizeof(char));
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
4 mars 2010 à 14:54
ne fonctionne hélas pas.
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 ;
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 ;
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
4 mars 2010 à 14:58
c'est quoi l'erreur exactement?
vous avez fait #include <malloc.h> au debut?
vous avez fait #include <malloc.h> au debut?
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
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 :/
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 :/
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
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
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
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))
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))
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
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,
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,
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
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.
Parce que ma première manière ne fonctionne pas en C 89.
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
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 ....
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 ....
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.
Alors qu'avec la première syntaxe, tab désignait bien le tableau.
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 !
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 !
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
4 mars 2010 à 15:32
Merci pour votre aide.