Pb d'allocation memoire en C pas résolu
Résolu
Utilisateur anonyme
-
Utilisateur anonyme -
Utilisateur anonyme -
A voir également:
- Pb d'allocation memoire en C pas résolu
- Mémoire vive - Guide
- RAM : type, format, CAS, vitesse, tout sur la mémoire vive - Guide
- Nettoyer memoire iphone - Guide
- Test memoire pc - Guide
- Gmail memoire insuffisante - Guide
22 réponses
Salut,
Attention, même si c'est souvent le cas, une allocation échoue ce n'est pas forcément un problème de manque de mémoire.
Ensuite, il y a plusieurs erreurs :
Tu as oublié le mot-clé struct dans ton typedef. La bonne syntaxe est : typedef struct Noeud* Message;
main() renvoie un int. Donc son prototype est int main(void) si tu ne veux pas d'arguments, et il retourne 0 (return 0;) si tout va bien.
Cdlt
Attention, même si c'est souvent le cas, une allocation échoue ce n'est pas forcément un problème de manque de mémoire.
Ensuite, il y a plusieurs erreurs :
Tu as oublié le mot-clé struct dans ton typedef. La bonne syntaxe est : typedef struct Noeud* Message;
main() renvoie un int. Donc son prototype est int main(void) si tu ne veux pas d'arguments, et il retourne 0 (return 0;) si tout va bien.
Cdlt
c'est vrai à propos de struct mais malheureusemen ça n'a pas résolu le problème j'aurai aimé que ça soit la source d'erreur mais R est toujours NULL
Il y a forcément une erreur quelque part. Pourrais-tu poster un code fonctionnel reproduisant ton erreur (donc en enlevant tout ce qui est inutile) en l'incluant entre deux balises code (à droite de souligner). Ca sera plus simple pour voir l'origine de l'erreur.
Vous n’avez pas trouvé la réponse que vous recherchez ?
Posez votre question
j'ai pas bien saisie ce que vous voulez dire par un code fonctionnel, je vous ai envoyé la partie du code qui contient l'erreur, ce n'est pas ça ce dont vous avez besoin ?
bon voila ce que j'ai pu faire j'espère que vous m'aider enfin
ressources creer: fichier message.txt contenant quelque ligne (2 ou 3) de texte et voici le code
ressources creer: fichier message.txt contenant quelque ligne (2 ou 3) de texte et voici le code
#include <stdio.h> #include <stdlib.h> #include <malloc.h> #include <string.h> #include <conio.h> struct Noeud{ //liste des message char content[201]; struct Cellule * response; }; typedef struct Noeud* Message; struct Cellule{ //arbre n-aire de reponse struct Noeud* message; struct Cellule* next; }; typedef struct Cellule* Response; Response create_response(char *s){ Response R; Message M; //alloction d'un espace pour la reponse if( R = (Response)calloc(1,sizeof(Response))){ //allocation d'un espace pour le message if( M = (Message)calloc(1,sizeof(Message))){ strncpy(M->content,s,200); M->content[200]='\0'; M->response = NULL; }else{ puts("memoire insuffisante"); return NULL; } //faire le lien entre la reponse et le message R->message = M; R->next = NULL; }else{ puts("memoire insuffisante"); return NULL; } return R; } void main (){ FILE *in; in = fopen("message.txt","r"); char buffer[256]; Response R = NULL; Message M = NULL; if(in){ while(fgets(buffer,256,in)){ R = create_response(buffer); } }else{ perror("Erreur: "); } fclose(in); }
Salut,
Je t'ai corrigé deux trois trucs. En tout cas sur ma machine, j'ai testé ton code et je n'ai aucune erreur segmentation sauf dans le cas où message.txt n'existe pas.
Je t'ai corrigé deux trois trucs. En tout cas sur ma machine, j'ai testé ton code et je n'ai aucune erreur segmentation sauf dans le cas où message.txt n'existe pas.
#include <stdio.h> #include <stdlib.h> #include <string.h> struct Noeud{ //liste des message char content[201]; struct Cellule * response; }; typedef struct Noeud* Message; struct Cellule{ //arbre n-aire de reponse struct Noeud* message; struct Cellule* next; }; typedef struct Cellule* Response; Response create_response(char *s){ Response R; Message M; //alloction d'un espace pour la reponse if( (R = (Response)calloc(1,sizeof(Response)))){ //allocation d'un espace pour le message if( (M = (Message)calloc(1,sizeof(Message)))){ strncpy(M->content,s,200); M->content[200]='\0'; M->response = NULL; }else{ puts("memoire insuffisante"); return NULL; } //faire le lien entre la reponse et le message R->message = M; R->next = NULL; }else{ puts("memoire insuffisante"); return NULL; } return R; } int main (void){ FILE *in; in = fopen("message.txt","r"); char buffer[256]; Response R = NULL; Message M = NULL; if(in){ while(fgets(buffer,256,in)){ R = create_response(buffer); } }else{ perror("Erreur: "); } fclose(in); free(R); free(M); return 0; }
t'a essayé avec 2 ou trois ligne de texte? comme ceci par exmple :
premier texte
deuxieme texte
troixième texte
premier texte
deuxieme texte
troixième texte
je peut prendre par ta parole que ça marche nickel sans pb? que le pb vient de mon foutu d'ordi ou d'ide?
Oui, c'est vraiment bizarre.
Le code que tu m'as donné marche bien sur ma machine. C'est tout ce que je peux t'assurer ^^.
Le code que tu m'as donné marche bien sur ma machine. C'est tout ce que je peux t'assurer ^^.
je compile avec visual Studio 2008, j'ai fait un déboguage pas à pas et a chaque fois le meme résultat R = NULL a partir de la deuxième
Bonsoir,
Je n'ai pas d'idée sur le refus du calloc mais je pense qu'un point important est à corriger:
R est de type Response soit un Cellule *
Ici la mémoire allouée dans le calloc est de taille 1 * sizeof( Response )
La zone mémoire demandée est donc prévue pour contenir un seul objet de type Response, ce qui correspond à la taille d'un pointeur sur une Cellule. (Soit 4 ou 8 octects selon l'architecture 32 ou 64 bits) Si la zone mémoire contient un Cellule *, alors le résultat du calloc qui est l'adresse de la zone réservée devrait être un Cellule ** (l'adresse d'une zone mémoire pouvant contenir une Cellule *)
Avec un exemple plus simple:
Je pense que le code voulu était :
Cela peut produire un erreur dans le programme mais normalement pas dans l'allocation elle-même.
Même chose pour le Message M.
Je regarde si ça marche chez moi,
M.
Je n'ai pas d'idée sur le refus du calloc mais je pense qu'un point important est à corriger:
Response R; //alloction d'un espace pour la reponse if( (R = (Response)calloc( 1, sizeof( Response ) ) )
R est de type Response soit un Cellule *
Ici la mémoire allouée dans le calloc est de taille 1 * sizeof( Response )
La zone mémoire demandée est donc prévue pour contenir un seul objet de type Response, ce qui correspond à la taille d'un pointeur sur une Cellule. (Soit 4 ou 8 octects selon l'architecture 32 ou 64 bits) Si la zone mémoire contient un Cellule *, alors le résultat du calloc qui est l'adresse de la zone réservée devrait être un Cellule ** (l'adresse d'une zone mémoire pouvant contenir une Cellule *)
Avec un exemple plus simple:
int *p; p = (int *) calloc( 1, sizeof( int ) ); // Au lieu de p = (int *) calloc( 1, sizeof( int* ) );
Je pense que le code voulu était :
Response R; //alloction d'un espace pour la reponse if( (R = (Response) calloc( 1, sizeof( Cellule ) ) )
Cela peut produire un erreur dans le programme mais normalement pas dans l'allocation elle-même.
Même chose pour le Message M.
Je regarde si ça marche chez moi,
M.
J'ai testé le code posté par Fiddy
Je confirme mon précédent post : La taille allouée dans les calloc n'est pas correct et produit des dépassements.
Le code a été compilé sous Visual 2003, les allocations mémoires sont effectuées sans erreur pour les deux premières. (R et M) Lors du deuxième appel à la fonction create, le premier calloc renvoie NULL chez moi aussi.
En corrigeant les tailles allouées (respectivement sizeof( Cellule ) et sizeof( Noeud ) ) évitant ainsi les dépassements, calloc se sent mieux et n'échoue plus lors des appels au create sur un fichier de test de 5 lignes.
Bien à vous,
M.
PS:
Effectivement le fclose est mal placé puisqu'il ferme le fichier même si le test du dessus trouve qu'il n'a pas été ouvert.
Je confirme mon précédent post : La taille allouée dans les calloc n'est pas correct et produit des dépassements.
Le code a été compilé sous Visual 2003, les allocations mémoires sont effectuées sans erreur pour les deux premières. (R et M) Lors du deuxième appel à la fonction create, le premier calloc renvoie NULL chez moi aussi.
En corrigeant les tailles allouées (respectivement sizeof( Cellule ) et sizeof( Noeud ) ) évitant ainsi les dépassements, calloc se sent mieux et n'échoue plus lors des appels au create sur un fichier de test de 5 lignes.
Bien à vous,
M.
PS:
Effectivement le fclose est mal placé puisqu'il ferme le fichier même si le test du dessus trouve qu'il n'a pas été ouvert.