[C]Fonction malloc ne répond pas

Résolu/Fermé
ilan27 Messages postés 394 Date d'inscription mardi 25 septembre 2007 Statut Membre Dernière intervention 15 juin 2009 - 3 févr. 2008 à 16:20
fiddy Messages postés 11069 Date d'inscription samedi 5 mai 2007 Statut Contributeur Dernière intervention 23 avril 2022 - 4 févr. 2008 à 00:41
Bonjour,

Je suis en train de créer un petit programme en C qui, à partir d'une feuille (fichier que j'ouvre avec fopen), crée un tableau de structures que j'ai nommée 'acte'. Dans une boucle while qui semble marcher, le programme:
_Lit la ligne
_Traite la ligne et insère les données dans la structure i du tableau (i indice incrémenté)
..etc...

Au fur et à mesure, j'affiche les résultats pour être sûr: ça s'affiche correctement. Mais sur les 18 lignes à lire, le programme s'arrète tantôt à la 9eme, tantôt à la 10eme... et ne termine jamais la feuille, sans jamais m'afficher un message d'erreur. Comme si tout se passait bien.J'ai localisé le problème dans la fonction malloc du while (voir plus bas). En effet, j'ai fait des affichages, et il semble s'arrêter au malloc. Ce n'est pas un problème de mémoire, sinon un message me l'aurait signalé (j'ai fait un test).
Même après des recherches sur Internet, je n'ai rien trouvé.

Voici le programme (j'ai enlevé des fonctions pour faire léger, elles marche très bien):

#include <stdio.h>
#include <stdlib.h>

#include <math.h>
#include <string.h>
#include "utile.h"


int main()
{
FILE *fiche=fopen("actes.txt", "r");
char *ligne=(char *)malloc(301*sizeof(char));
char *nom=(char *)malloc(10*sizeof(char));
char *description=(char *)malloc(200*sizeof(char));
char *acte1=(char *)malloc(10*sizeof(char));
char *acte2=(char *)malloc(10*sizeof(char));
char *das=(char *)malloc(10*sizeof(char));
double prix1=0;
double prix2=0;
double prix;
double min;
double max;
double da;
int i=0;

fgets(das, 9, fiche);
da=stodb(das);
printf("DA= %g %%\n\n",da);
while(fgets(ligne, 300, fiche)!=NULL && i<NOMBRE){

if((actes[i]=(struct acte *)malloc(sizeof(struct acte)))==NULL){ //************ICI: après, le programme s'arrète, et ce qui suit
//************ne s'affiche pas
printf("Pas assez de place\n"); // Ne s'affiche jamais
}
printf("%d\n", i);
decompo(ligne, nom, description, &prix);
strcpy(actes[i]->nom,nom);
strcpy(actes[i]->description,description);
actes[i]->prix=prix;
i++;

}
//Tableau crée

printf("Veuillez entrer le code de l'acte n°1, en majuscules:\n");
scanf("%s", acte1);
printf("Veuillez entrer le code de l'acte n°2, en majuscules:\n");
scanf("%s", acte2);

i=0;
for(i; actes[i]!=NULL && i<NOMBRE; i++){
if(!strcmp(actes[i]->nom, acte1)){
//Acte 1 rentré
prix1=actes[i]->prix;
}
if(!strcmp(actes[i]->nom, acte2)){
//Acte 2 rentré
prix2=actes[i]->prix;
}
}
if(prix1==0 || prix2==0){
printf("Code(s) incorrects\n");
}else{
min=(prix1<=prix2)?prix1:prix2;
max=(prix1>=prix2)?prix1:prix2;
printf("\n\nVoici les resultats:\n\n");
printf("Acte 1 sans da: %g, avec da: %g\n", min, ceilf(min*da));
}
free(ligne);
free(nom);
free(description);
free(acte1);
free(acte2);
free(das);

fclose(fiche);

}

Merci beaucoup!! (J'utilise Code::blocks)

2 réponses

ilan27 Messages postés 394 Date d'inscription mardi 25 septembre 2007 Statut Membre Dernière intervention 15 juin 2009 36
3 févr. 2008 à 18:58
Bon, en fait, ce n'est pas un problème du malloc. Enfin si mais pas celui-là: il fallait aussi allouer de l'espace mémoire à toutes les variables-pointeur (ici nom et description) qui composent la structure. Je ne sais pas comment ça se passe, mais en tout cas maintenant tout marche.
0
fiddy Messages postés 11069 Date d'inscription samedi 5 mai 2007 Statut Contributeur Dernière intervention 23 avril 2022 1 835
4 févr. 2008 à 00:41
Salut,

En effet, il faut allouer de la mémoire à tous les pointeurs sous peine de faire des débordements de tampons.
Sinon, petite remarque : pourquoi faire malloc(301*...) au lieu de faire un simple char nom[301] ?
0