Erreur d'un programme en language C
Résolu/Fermé
flashdumpf
Messages postés
17
Date d'inscription
lundi 5 janvier 2009
Statut
Membre
Dernière intervention
14 mai 2010
-
1 mars 2009 à 15:21
loupius - 1 mars 2009 à 23:00
loupius - 1 mars 2009 à 23:00
A voir également:
- Erreur d'un programme en language C
- Erreur 0x80070643 - Accueil - Windows
- Programme demarrage windows 10 - Guide
- Erreur 0x80070643 Windows 10 : comment résoudre le problème de la mise à jour KB5001716 - Accueil - Windows
- Mettre en veille un programme - Guide
- Erreur 1001 outlook - Accueil - Bureautique
5 réponses
free(adresses);
Mais aucune allocation n'a été faite pour 'adresses', alors à la libération... ça plante... et c'est normal!!!
Mais aucune allocation n'a été faite pour 'adresses', alors à la libération... ça plante... et c'est normal!!!
[o.o]REplay
Messages postés
357
Date d'inscription
vendredi 20 juin 2008
Statut
Membre
Dernière intervention
20 juillet 2009
28
1 mars 2009 à 15:36
1 mars 2009 à 15:36
Le but de cet exo est de te faire comprendre les erreurs à ne pas faire, et cet exercice en est truffé.
On ne va pas le résoudre pour toi, si encore c'est toi qui l'avais fait..
Si tu as du mal en C, vas voir à cette adresse:
https://openclassrooms.com/fr/courses/19980-apprenez-a-programmer-en-c
Sinon compile ton code, et résous les erreurs au fur et à mesure.
On ne va pas le résoudre pour toi, si encore c'est toi qui l'avais fait..
Si tu as du mal en C, vas voir à cette adresse:
https://openclassrooms.com/fr/courses/19980-apprenez-a-programmer-en-c
Sinon compile ton code, et résous les erreurs au fur et à mesure.
flashdumpf
Messages postés
17
Date d'inscription
lundi 5 janvier 2009
Statut
Membre
Dernière intervention
14 mai 2010
1
1 mars 2009 à 16:21
1 mars 2009 à 16:21
En fait c'est moi qui ai fait cet exercice...
J'ai déja trouvé une solution au premier probleme:
Que j'ai remplacer par:
Truffé d'erreur? Le programme m'affiche pourtant les bonnes réponses, j'ai juste qu'une erreur au niveau de la libération de mémoire, une erreur windows:
Debug Assertion Failed!
Expression:_CrtIsValidHeapPointer(pUserData)
En regardant sur Google, je vois que cela a un rapport avec la mémoire allouée dynamiquement, mais je n'arrive pas à trouver où se situe l'erreur...
J'ai déja trouvé une solution au premier probleme:
if(Nom=="quit"){ break; }
Que j'ai remplacer par:
if(!strcmp(Nom,"quit")){ break; }
Truffé d'erreur? Le programme m'affiche pourtant les bonnes réponses, j'ai juste qu'une erreur au niveau de la libération de mémoire, une erreur windows:
Debug Assertion Failed!
Expression:_CrtIsValidHeapPointer(pUserData)
En regardant sur Google, je vois que cela a un rapport avec la mémoire allouée dynamiquement, mais je n'arrive pas à trouver où se situe l'erreur...
Je reprends la main.
Tu demandes de la mémoire par malloc et si tu n'as pu en obtenir (adresses[i] est 0) alors tu libères la mémoire... qui n'a pas été allouée!!! En général, dans ce genre de situation, on affiche un message de mémoire saturée et... on se tire!!!
adresses[i]=(char*)malloc(lg*sizeof(char)); if(!adresses[i]){ liberer(adresses,i); break; }donc si je comprends bien:
Tu demandes de la mémoire par malloc et si tu n'as pu en obtenir (adresses[i] est 0) alors tu libères la mémoire... qui n'a pas été allouée!!! En général, dans ce genre de situation, on affiche un message de mémoire saturée et... on se tire!!!
Vous n’avez pas trouvé la réponse que vous recherchez ?
Posez votre question
flashdumpf
Messages postés
17
Date d'inscription
lundi 5 janvier 2009
Statut
Membre
Dernière intervention
14 mai 2010
1
1 mars 2009 à 22:27
1 mars 2009 à 22:27
Effectivement, je ne peux faire de free d'adresse qui n'a pas été alloué avec malloc... je n'y avais pas pensé
Merci
Et pour ce qui est de libérer la mémoire en cas d'échec, c'est le prof qui le veut ainsi... :D
Merci
Et pour ce qui est de libérer la mémoire en cas d'échec, c'est le prof qui le veut ainsi... :D
Libérer de la mémoire qui n'a pas pu être allouée... désolé mais ton prof a forcément tort mais peut-être n'as-tu pas compris son propos! De là à se tirer pour aller acheter une barette mémoire supplémentaire, il ne faut pas exagérer; on peut effectivement se contenter de ne plus s'obstiner à remplir la mémoire et même parfois attendre qu'un autre programme rende un peu de mémoire...
NB: j'ai un peu exagéré en te charriant au sujet de libérer un pointeur NULL. En effet, selon les dernières implémentations du C, il est possible d'écrire 'free(NULL)' - dans ce cas free ne fait rien -; mais faire un 'free(0)' montre, en général, une mauvaise démarche.
Bonne nuit.
NB: j'ai un peu exagéré en te charriant au sujet de libérer un pointeur NULL. En effet, selon les dernières implémentations du C, il est possible d'écrire 'free(NULL)' - dans ce cas free ne fait rien -; mais faire un 'free(0)' montre, en général, une mauvaise démarche.
Bonne nuit.