[C]Fonction malloc ne répond pas

Résolu
ilan27 Messages postés 394 Date d'inscription   Statut Membre Dernière intervention   -  
fiddy Messages postés 11069 Date d'inscription   Statut Contributeur Dernière intervention   -
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)
A voir également:

2 réponses

ilan27 Messages postés 394 Date d'inscription   Statut Membre Dernière intervention   36
 
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   Statut Contributeur Dernière intervention   1 846
 
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