Use of uninitialised value of size 8

Résolu/Fermé
rosate999 Messages postés 5 Date d'inscription mercredi 22 janvier 2014 Statut Membre Dernière intervention 24 janvier 2014 - 23 janv. 2014 à 17:39
fiddy Messages postés 11069 Date d'inscription samedi 5 mai 2007 Statut Contributeur Dernière intervention 23 avril 2022 - 24 janv. 2014 à 19:18
Bonjour,
Voici mon code, je ne sais pourquoi il donne un erreur de segmentation!!!

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

typedef struct {
int i;
int j;
double c;
}point;
typedef struct {
point *a;
}tableau_t;

int myfunc( char *fichier){
int i, i1,i2, ind1, ind2;
double c,val;
double calcul;
point **a;
FILE *matriceDistance;
matriceDistance = fopen("fichier.txt", "r");

for(i=0;i<6;i++) {
fscanf(matriceDistance,"%d %d %lf", &i1,&i2, &val);
((*a)[i]).i=i1;
((*a)[i]).j=i2;
((*a)[i]).c=val;
printf("%d %d %lf \n", i1, i2, ((*a)[i]).c);

}
tableau_t *tableau;
calcul=0;
a=tableau->a;
for(i=0;i<6;i++){
ind1=a[i]->i;
ind2=a[i]->j;
c=a[i]->c;
calcul=calcul+(*a)[i].c;

}
printf("%lf", calcul);
}


int main(int argc,char **argv){
char *distanceMatrice, tab;
tab=myfunc(distanceMatrice);
return 0;
}

l'erreur de segmentation est le suivant: Use of uninitialised value of size 8

j'espère que quelqu'un peut m'aider.
Merci par avance

rosate999

3 réponses

ElementW Messages postés 4816 Date d'inscription dimanche 12 juin 2011 Statut Contributeur Dernière intervention 5 octobre 2021 1 228
23 janv. 2014 à 19:01
Salut, soit dit en passant: utilise la balise
<code>
pour mettre du code dans tes messages, ça garde l'indentation et t'as des couleurs en plus.

Pour commencer, la première erreur que je vois est que tu cherches à accéder à un élément de
a
sans avoir alloué de mémoire, donc
a
est un pointeur vide, donc c'est le crash assuré.
Sachant que ta boucle traite maxi 6 lignes, il faut allouer 6 pointeurs de points:
...
matriceDistance = fopen("fichier.txt", "r");
a = calloc(sizeof(point *), 6);
...
Maintenant a pourra recevoir 6 pointeurs de structure
point
.

Deuxièmement, ta manière d'accéder aux éléments de ta struct dans le tableau est on ne peut plus étrange, surtout que plus bas tu y accèdes correctement:
((*a)[i]).i=i1;  // WTF o_O?
/* Devient */
a[i]->i=i1; // Là c'est propre
Mais une fois de plus tu accèdes à un pointeur
NULL
, il faut allouer de la mémoire pour ton point:
...
fscanf(matriceDistance,"%d %d %lf", &i1,&i2, &val);
a[i] = malloc(sizeof(point));
...


Le dernier hic est que je ne vois pas à quoi sert ton
tableau_t *tableau;
vu que tu ne t'en sers pas, et que tu fais ça
a=tableau->a;
et que c'est pas cool: tu vas perdre ton tableau de points, sans libérer la mémoire en plus... J'ai donc mis les 2 lignes citées en commentaire, et ça marche.
2
fiddy Messages postés 11069 Date d'inscription samedi 5 mai 2007 Statut Contributeur Dernière intervention 23 avril 2022 1 842
23 janv. 2014 à 22:16
L'allocation de "a" n'est pas correcte par rapport à son code. C'est le contraire ;-).
0