Probleme malloc

Résolu
miki -  
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.

10 réponses

(Pabix) Messages postés 578 Date d'inscription   Statut Membre Dernière intervention   81
 
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.
0
fiddy Messages postés 11069 Date d'inscription   Statut Contributeur Dernière intervention   1 846
 
Salut
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é.
0
miki
 
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
0
fiddy Messages postés 11069 Date d'inscription   Statut Contributeur Dernière intervention   1 846
 
C'est normal que ça plante, c'est toujours incorrect. Relis mon post et t'auras ta solution ;)
0
miki
 
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
0

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

Posez votre question
(Pabix) Messages postés 578 Date d'inscription   Statut Membre Dernière intervention   81
 
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.
0
fiddy Messages postés 11069 Date d'inscription   Statut Contributeur Dernière intervention   1 846
 
Euh, attention à pas confondre char* avec char[] quand même, rien à voir.
0
(Pabix) Messages postés 578 Date d'inscription   Statut Membre Dernière intervention   81 > fiddy Messages postés 11069 Date d'inscription   Statut Contributeur Dernière intervention  
 
Ça n’a rien à voir seulement si on met des chiffres dans les crochets.
0
fiddy Messages postés 11069 Date d'inscription   Statut Contributeur Dernière intervention   1 846 > (Pabix) Messages postés 578 Date d'inscription   Statut Membre Dernière intervention  
 
Ç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.
0
(Pabix) Messages postés 578 Date d'inscription   Statut Membre Dernière intervention   81 > fiddy Messages postés 11069 Date d'inscription   Statut Contributeur Dernière intervention  
 
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.
0
fiddy Messages postés 11069 Date d'inscription   Statut Contributeur Dernière intervention   1 846 > (Pabix) Messages postés 578 Date d'inscription   Statut Membre Dernière intervention  
 
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
0
(Pabix) Messages postés 578 Date d'inscription   Statut Membre Dernière intervention   81
 
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);
0
miki
 
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
0
(Pabix) Messages postés 578 Date d'inscription   Statut Membre Dernière intervention   81
 
On t’en prie ! Bonne continuation !
0
miki
 
merci je poste le probleme en resolu etant donne que j'ai eu ma reponse
0
dhaou2dao
 
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 !!
0
fiddy Messages postés 11069 Date d'inscription   Statut Contributeur Dernière intervention   1 846
 
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).
0