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
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 mercredi 18 mai 2005 Statut Membre Dernière intervention 27 octobre 2009 81
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.
0
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
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
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 samedi 5 mai 2007 Statut Contributeur Dernière intervention 23 avril 2022 1 836
10 juil. 2008 à 13:36
C'est normal que ça plante, c'est toujours incorrect. Relis mon post et t'auras ta solution ;)
0
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 mercredi 18 mai 2005 Statut Membre Dernière intervention 27 octobre 2009 81
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.
0
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
Euh, attention à pas confondre char* avec char[] quand même, rien à voir.
0
(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
Ça n’a rien à voir seulement si on met des chiffres dans les crochets.
0
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
Ç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 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
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 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
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 mercredi 18 mai 2005 Statut Membre Dernière intervention 27 octobre 2009 81
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);
0
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 mercredi 18 mai 2005 Statut Membre Dernière intervention 27 octobre 2009 81
10 juil. 2008 à 13:48
On t’en prie ! Bonne continuation !
0
merci je poste le probleme en resolu etant donne que j'ai eu ma reponse
0
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 samedi 5 mai 2007 Statut Contributeur Dernière intervention 23 avril 2022 1 836
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).
0