Я работаю над созданием программы C для реализации списков в двоичном файле, и после компиляции я получил ошибку сегментации. Это мой код:Ошибка сегментации в C
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#define LONG_NP 30
struct Personne {
char nomPre[LONG_NP+1];
char sexe ;
float taille, poids ;
};
struct Elem {
struct Personne pers ;
struct Elem * suivant ;
};
typedef struct Elem * pointeur ;
typedef struct Elem Element;
void lire(FILE * aLire, struct Personne * P) {
struct Personne unePers ;
fgets(unePers.nomPre, LONG_NP+1, aLire) ;
fscanf(aLire,"%c%f%f\n", &unePers.sexe, &unePers.taille,
&unePers.poids);
*P = unePers;
}
void creerFIFO(pointeur * P) {
pointeur laListe = NULL, tempo, presentement;
FILE * aLire = fopen("metrique.tp3", "r");
while (! feof(aLire)) {
tempo = (pointeur) malloc (sizeof (struct Elem));
lire(aLire, &tempo->pers);
if (laListe == NULL)
laListe = tempo ;
else
presentement->suivant = tempo;
presentement = tempo;
}
fclose(aLire);
if (laListe) presentement->suivant = NULL;
*P = laListe;
}
void afficher(pointeur liste, char ordre[]) {
printf("Contenu de la liste en ordre %s\n", ordre);
while (liste) {
printf("%s %c % 7.2f %8.1f\n", liste->pers.nomPre,
liste->pers.sexe, liste->pers.taille, liste->pers.poids);
liste = liste->suivant;
}
}
void creerBinaire(pointeur liste, char * nomFile) {
FILE * aCreer = fopen(nomFile, "wb");
int nbOctets = sizeof(struct Personne);
if(!aCreer)
printf("Fichier pas ouvert\n");
while (liste) {
fwrite(&liste->pers, nbOctets, 1, aCreer);
liste = liste->suivant;
}
fclose(aCreer);
printf("Fin de la creation du fichier binaire\n");
}
void relire(char nomFile[]) {
FILE * aLire = fopen(nomFile, "rb");
struct Personne unePers ;
int rang = 0, nbOctets = sizeof(struct Personne);
while (fread(&unePers, nbOctets, 1, aLire), !feof(aLire))
printf("%2d) %s %c % 7.2f %8.1f\n", ++rang,
unePers.nomPre, unePers.sexe, unePers.taille,
unePers.poids);
fclose(aLire);
}
/* écrivez vos fonctions ici avec, en commentaires, le numéro de la
question de l'examen à laquelle elles répondent.
*/
/* Question 6 */
void chercherNom(pointeur Liste, pointeur *Av, pointeur *CL, char Nom[])
{
pointeur Avant = NULL;
int trouve = 0;
while (Liste && !trouve)
{
if(strcmp(Nom, Liste->pers.nomPre)!=0)
{
Avant = Liste;
Liste = Liste->suivant;
}
else
trouve = 1;
}
*Av = Avant;
*CL = Liste;
}
void Changer(struct Personne * A, struct Personne B)
{
struct Personne Tempo = *A;
if(strcmp(Tempo.nomPre, B.nomPre) !=0)
strcpy(Tempo.nomPre, B.nomPre);
if(B.sexe != ' ')
Tempo.sexe = B.sexe;
if(B.taille > 0)
Tempo.taille = B.taille;
if(B.poids >0)
Tempo.poids = B.poids;
*A = Tempo;
}
void cherModif(pointeur Liste, char Nom[], struct Personne Pers)
{
pointeur Avant, CL;
struct Personne Tempo;
chercherNom(Liste,&Avant, &CL,Nom);
if(CL)
{
Tempo = CL->pers;
printf("trouve %s\n",Tempo.nomPre);
Changer(&Tempo,Pers);
CL->pers = Tempo;
}
else
printf("pas trouve %s\n",Nom);
}
void CreerLIFO(pointeur Liste, pointeur *P, char sexevoulu)
{
pointeur L = NULL;
pointeur Tempo;
while(Liste)
{
if(Liste->pers.sexe == sexevoulu)
{
Tempo = (Element *) malloc(sizeof(Element));
Tempo->pers = Liste->pers;
Tempo->suivant = L;
L = Tempo;
}
Liste = Liste->suivant;
}
*P = L;
}
void main() {
/* Écrivez les déclarations des 2 nouvelles listes ici */
pointeur ListeF, ListeM ;
pointeur liste ;
/* question 6 */
struct Personne Tempo;
char NomTempo[LONG_NP+1];
creerFIFO(&liste);
afficher(liste, "FIFO");
/* Écrivez les appels de la fonctions de la
question 6 ici, le bon résultat sera observé
avec la relecture de metrique.bin
*/
strcpy(Tempo.nomPre,"BEDARD MARC-ANDRE ");
Tempo.sexe = 'M';
Tempo.taille = 1.54;
Tempo.poids = 0;
cherModif(liste,Tempo.nomPre,Tempo);
strcpy(NomTempo,"TREMBLAY CYLVAIN ");
strcpy(Tempo.nomPre,"TREMBLAY SYLVAIN ");
Tempo.sexe = ' ' ;
Tempo.taille = 0;
Tempo.poids = 0;
cherModif(liste,NomTempo,Tempo);
creerBinaire(liste, "metrique.bin");
relire("metrique.bin");
/* Écrivez les appels pour la question 7 ici */
CreerLIFO(liste,&ListeF,'F');
CreerLIFO(liste,&ListeM,'M');
/* Pour tester, écrivez 2 appels de la fonction
afficher : */
afficher(ListeF,"LIFO");
afficher(ListeM,"LIFO");
}
Я использую GCC как компилятор, и я не получил какую-либо вины с компиляцией, возникает проблема, когда я пытался возбудить файл вывод с помощью команды ./a .out и здесь я получил Fault без каких-либо спецификаций. Итак, вопрос в том, как решить проблему с сегментацией, потому что я еще не вижу ее в коде.
Теперь после отладки я нахожу это:
Starting program: /root/a.out
Breakpoint 1, main() at /root/Desktop/tp/liste.c:282
282 creerFIFO(&liste);
(gdb) s
creerFIFO (P=0x7fffffffe2d8) at /root/Desktop/tp/liste.c:54
54 pointeur laListe = NULL, tempo, presentement;
(gdb) s
58 FILE * aLire = fopen("metrique.tp3", "r");
(gdb) s
60 while (! feof(aLire)) {
(gdb) s
Program received signal SIGSEGV, Segmentation fault.
0x00007ffff7aa4230 in feof() from /lib/x86_64-linux-gnu/libc.so.6
Это означает, что у меня возникли проблемы с функцией в то время как
Где вы получите ошибку Сегментация Fault?Пожалуйста, отметьте более или менее, где это происходит, поэтому будущим пользователям не нужно читать _all_ кода и вместо этого просто более важные части. – Arc676
В чем вопрос? – fuz
Я использую GCC в качестве компилятора, и у меня не было никакой ошибки в компиляции, проблема возникает, когда я пытался возбудить выходной файл с помощью команды ./a.out, и здесь я получил Fault без каких-либо спецификаций , –