Probleme malloc
Résolu/Fermé
miki
-
10 juil. 2008 à 13:17
fiddy Messages postés 11069 Date d'inscription samedi 5 mai 2007 Statut Contributeur Dernière intervention 23 avril 2022 - 2 nov. 2008 à 13:55
fiddy Messages postés 11069 Date d'inscription samedi 5 mai 2007 Statut Contributeur Dernière intervention 23 avril 2022 - 2 nov. 2008 à 13:55
10 réponses
(Pabix)
Messages postés
578
Date d'inscription
mercredi 18 mai 2005
Statut
Membre
Dernière intervention
27 octobre 2009
81
10 juil. 2008 à 13:20
10 juil. 2008 à 13:20
bonjour. Attention, vous faites pas mal d’erreurs.
char *mem[1000] déclare un tableau de 1000 chaînes de caractères, et non pas une chaîne de 1000 caractères : pour ça, utilisez
char mem[1000], ou char *mem.
Dans le deuxième cas SEULEMENT, il faut allouer la mémoire, dans le premier, la taille est déjà allouée statiquement par le compilateur :
mem = malloc (1000 * sizeof(char));
Mais il y a plus simple :
scanf("%as", &mem), alloue directement la mémoire à la volée.
char *mem[1000] déclare un tableau de 1000 chaînes de caractères, et non pas une chaîne de 1000 caractères : pour ça, utilisez
char mem[1000], ou char *mem.
Dans le deuxième cas SEULEMENT, il faut allouer la mémoire, dans le premier, la taille est déjà allouée statiquement par le compilateur :
mem = malloc (1000 * sizeof(char));
Mais il y a plus simple :
scanf("%as", &mem), alloue directement la mémoire à la volée.
fiddy
Messages postés
11069
Date d'inscription
samedi 5 mai 2007
Statut
Contributeur
Dernière intervention
23 avril 2022
1 836
10 juil. 2008 à 13:27
10 juil. 2008 à 13:27
Salut
Pourquoi faire du char*mem[1000] avec de l'allocation dynamique ?
A moins que tu comptes faire d'autres choses, ceci devrait marcher :
D'ailleurs, il ne faut pas utiliser scanf pour les chaines de caractères. fgets est à privilégier pour des raisons de sécurité.
Pourquoi faire du char*mem[1000] avec de l'allocation dynamique ?
A moins que tu comptes faire d'autres choses, ceci devrait marcher :
#include <stdio.h> #include <stdlib.h> int main(void){ char mem[1000]; printf("entrer votre nom\n"); scanf("%s",mem); printf("votre nom est %s \n",mem); free(mem); system("PAUSE"); return 0; }
D'ailleurs, il ne faut pas utiliser scanf pour les chaines de caractères. fgets est à privilégier pour des raisons de sécurité.
merci d'avoir repondu oui pour le char mem[1000] erreur de ma par normalement j'etai sense ecrir char *mem[]=NULL
c'est a ce moment que ça plante a la compile
c'est a ce moment que ça plante a la compile
fiddy
Messages postés
11069
Date d'inscription
samedi 5 mai 2007
Statut
Contributeur
Dernière intervention
23 avril 2022
1 836
10 juil. 2008 à 13:36
10 juil. 2008 à 13:36
C'est normal que ça plante, c'est toujours incorrect. Relis mon post et t'auras ta solution ;)
oui tu parle de debordement de buffer la fiddy je connai mais desole mais je comprend tj pa comment declarer mon buffer avec malloc tu pourrai m'eclairer d'avantage silte plait
Vous n’avez pas trouvé la réponse que vous recherchez ?
Posez votre question
(Pabix)
Messages postés
578
Date d'inscription
mercredi 18 mai 2005
Statut
Membre
Dernière intervention
27 octobre 2009
81
10 juil. 2008 à 13:39
10 juil. 2008 à 13:39
Bonjour, char *mem[] c’est un DOUBLE TABLEAU, ie un tableau de tableaux, et c’est pas ce que vous voulez !
char, c’est un caractère.
char * ou char [], c’est un tableau de caractères (par exemple une chaîne de caractères)
char ** ou char[][] ou char *[] c’est un tableau de tableaux.
char, c’est un caractère.
char * ou char [], c’est un tableau de caractères (par exemple une chaîne de caractères)
char ** ou char[][] ou char *[] c’est un tableau de tableaux.
fiddy
Messages postés
11069
Date d'inscription
samedi 5 mai 2007
Statut
Contributeur
Dernière intervention
23 avril 2022
1 836
10 juil. 2008 à 13:41
10 juil. 2008 à 13:41
Euh, attention à pas confondre char* avec char[] quand même, rien à voir.
(Pabix)
Messages postés
578
Date d'inscription
mercredi 18 mai 2005
Statut
Membre
Dernière intervention
27 octobre 2009
81
>
fiddy
Messages postés
11069
Date d'inscription
samedi 5 mai 2007
Statut
Contributeur
Dernière intervention
23 avril 2022
10 juil. 2008 à 13:42
10 juil. 2008 à 13:42
Ça n’a rien à voir seulement si on met des chiffres dans les crochets.
fiddy
Messages postés
11069
Date d'inscription
samedi 5 mai 2007
Statut
Contributeur
Dernière intervention
23 avril 2022
1 836
>
(Pabix)
Messages postés
578
Date d'inscription
mercredi 18 mai 2005
Statut
Membre
Dernière intervention
27 octobre 2009
10 juil. 2008 à 13:49
10 juil. 2008 à 13:49
Ça n’a rien à voir seulement si on met des chiffres dans les crochets.
Faux. Petite mise au point.
char toto[]; n'existe pas.
char toto [6]="coucou"; ou char toto[]="coucou"; est rigoureusement pareil.
char *titi; est un pointeur alors que char toto[6] est un tableau.
sizeof(titi) = 4 alors que sizeof(toto)=6;
Tu vois bien que c'est pas pareil. De plus le pointeur (titi)initialisera dans le heap alors que le tableau (toto) initialisera dans le stack. Vraiment rien à voir.
(Pabix)
Messages postés
578
Date d'inscription
mercredi 18 mai 2005
Statut
Membre
Dernière intervention
27 octobre 2009
81
>
fiddy
Messages postés
11069
Date d'inscription
samedi 5 mai 2007
Statut
Contributeur
Dernière intervention
23 avril 2022
10 juil. 2008 à 13:52
10 juil. 2008 à 13:52
Oui, je suis bien au courant de tout cela. Mais attention, char toto[6] = "coucou" ; risque de te causer quelque problème. Cette chaîne a une taille de 7.
fiddy
Messages postés
11069
Date d'inscription
samedi 5 mai 2007
Statut
Contributeur
Dernière intervention
23 avril 2022
1 836
>
(Pabix)
Messages postés
578
Date d'inscription
mercredi 18 mai 2005
Statut
Membre
Dernière intervention
27 octobre 2009
10 juil. 2008 à 13:55
10 juil. 2008 à 13:55
Oui j'ai pensé au \0 mais j'ai mal compté "coucou". J'ai pas assez de doigts sur ma main. Mais bon il n'empêche que char *toto; et char toto[6] n'ont rien à voir ^^.
Cdt
Cdt
(Pabix)
Messages postés
578
Date d'inscription
mercredi 18 mai 2005
Statut
Membre
Dernière intervention
27 octobre 2009
81
10 juil. 2008 à 13:42
10 juil. 2008 à 13:42
Si tu déclares
char mem[1000] c’est une déclaration statique de chaîne de caractères.
Si tu déclares char *mem = malloc (1000 * sizeof(char)) ça revient en pratique à la même chose (pour l’utilisateur, pas pour ce qui se passe réellement à l’exécution)
Malloc, c’est pour quand tu vas décider de la taille allouée au cours de l’exécution du programme. Si tu veux 1000 caractères, alors utilise une allocation statique, et pas avec malloc (dynamique).
scanf peut allouer la place qu’il faut à la lecture avec %as ; tu peux donc faire char *mem ; scanf ("%as", &mem);
char mem[1000] c’est une déclaration statique de chaîne de caractères.
Si tu déclares char *mem = malloc (1000 * sizeof(char)) ça revient en pratique à la même chose (pour l’utilisateur, pas pour ce qui se passe réellement à l’exécution)
Malloc, c’est pour quand tu vas décider de la taille allouée au cours de l’exécution du programme. Si tu veux 1000 caractères, alors utilise une allocation statique, et pas avec malloc (dynamique).
scanf peut allouer la place qu’il faut à la lecture avec %as ; tu peux donc faire char *mem ; scanf ("%as", &mem);
oki j'ai comprit, en faite j'avai carrement mal comprit la diferende entre un char et un tableau de char j'ai modifier mon code en me referant a vos conseil et ça fonctionne merci beaucoup de m'avoir remi sur le droit chemin lol
(Pabix)
Messages postés
578
Date d'inscription
mercredi 18 mai 2005
Statut
Membre
Dernière intervention
27 octobre 2009
81
10 juil. 2008 à 13:48
10 juil. 2008 à 13:48
On t’en prie ! Bonne continuation !
bonjour à tous,
je pense plutôt qu'il faut déclaré le tableau etant que int
int tableau[]= ............ et là tu peux mettre tout ce qui tu veux la dans !!
je pense si tu mets tableau de type char le compilateur t'enverra l'erreur suivante : tableau n'est pas de type char
salut et bon courage !!
je pense plutôt qu'il faut déclaré le tableau etant que int
int tableau[]= ............ et là tu peux mettre tout ce qui tu veux la dans !!
je pense si tu mets tableau de type char le compilateur t'enverra l'erreur suivante : tableau n'est pas de type char
salut et bon courage !!
fiddy
Messages postés
11069
Date d'inscription
samedi 5 mai 2007
Statut
Contributeur
Dernière intervention
23 avril 2022
1 836
2 nov. 2008 à 13:55
2 nov. 2008 à 13:55
Non.
Pour mettre une chaîne de caractères, on ne prend pas un tableau d'entiers.
Soit on prend un tableau de char (char toto[NB]), soit on prend un pointer char (char *toto).
Pour mettre une chaîne de caractères, on ne prend pas un tableau d'entiers.
Soit on prend un tableau de char (char toto[NB]), soit on prend un pointer char (char *toto).