Probleme malloc
Résolu
miki
-
fiddy Messages postés 11069 Date d'inscription Statut Contributeur Dernière intervention -
fiddy Messages postés 11069 Date d'inscription Statut Contributeur Dernière intervention -
Bonjour a tous j'apprend au fur et a meusure le language c et je nut sur l'utilisation de malloc en faite cette fonction me prait tres pratique pour les tableau afin de gerer automatiquement la memoire mais je n'arrive pa a l'utiliser lorsque je declare un buffer :
char *mem[1000];
mem=malloc(sizeof (char));
if(mem==NULL)
{
exit (0);
}
printf("entrer votre nom\n");
scanf("%s",&mem);
printf("votre nom est %s \n",mem);
free(mem);
system("PAUSE");
A la compilation j'obtient un "incompatible type assignement" aurai-je mal comprit le but de cette fonction, peut on s'en servir pour controler automatiquement la taille d'un buffer ( un buffer et bien un tableau non ?).
si vous pouviez me donner un exemple simple de malloc avec un buffer ce serai sympa car je suis debutant je le repete merci.
Merci par avance de vos réponses.
char *mem[1000];
mem=malloc(sizeof (char));
if(mem==NULL)
{
exit (0);
}
printf("entrer votre nom\n");
scanf("%s",&mem);
printf("votre nom est %s \n",mem);
free(mem);
system("PAUSE");
A la compilation j'obtient un "incompatible type assignement" aurai-je mal comprit le but de cette fonction, peut on s'en servir pour controler automatiquement la taille d'un buffer ( un buffer et bien un tableau non ?).
si vous pouviez me donner un exemple simple de malloc avec un buffer ce serai sympa car je suis debutant je le repete merci.
Merci par avance de vos réponses.
10 réponses
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.
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
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
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.
Ç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.
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