Téléchargement
illégal
Posez votre question Signaler

Probleme malloc [Résolu]

miki - Dernière réponse le 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.
Lire la suite 

Probleme malloc »

17 réponses
Réponse
+0
moins plus
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.
Ajouter un commentaire
Réponse
+0
moins plus
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é.
Ajouter un commentaire
Réponse
+0
moins plus
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
fiddy- 10 juil. 2008 à 13:36
C'est normal que ça plante, c'est toujours incorrect. Relis mon post et t'auras ta solution ;)
Ajouter un commentaire
Réponse
+0
moins plus
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
Ajouter un commentaire
Réponse
+0
moins plus
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.
fiddy- 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)- 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- 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
Ajouter un commentaire
Réponse
+0
moins plus
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);
Ajouter un commentaire
Réponse
+0
moins plus
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
Ajouter un commentaire
Réponse
+0
moins plus
On t’en prie ! Bonne continuation !
Ajouter un commentaire
Réponse
+0
moins plus
merci je poste le probleme en resolu etant donne que j'ai eu ma reponse
Ajouter un commentaire
Réponse
+0
moins plus
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 !!
fiddy- 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).
Ajouter un commentaire
Ce document intitulé « probleme malloc » issu de CommentCaMarche (www.commentcamarche.net) est mis à disposition sous les termes de la licence Creative Commons. Vous pouvez copier, modifier des copies de cette page, dans les conditions fixées par la licence, tant que cette note apparaît clairement.
Dossier à la une
Passage au tout numérique : quel coût pour les particuliers ?