在此程序中,我插入从列表中的文件读取的值。在标题中有句柄
dizionario.h
typedef struct dizionario* DIZ;
lista.h
typedef struct lista* LISTA;
在main中,我调用函数init_diz,它返回一个指针DIZ
的main.c
FILE *fp;
DIZ d;
...
if((d=init_diz(&fp))==NULL)
return EXIT_FAILURE;
dizionario.c
struct dizionario{
LISTA head;
LISTA tail;
};
DIZ init_diz(FILE **f)
{
DIZ nuovo;
nuovo=(DIZ)malloc(sizeof(struct dizionario));
if(nuovo==NULL)
return nuovo;
if(!alloc_lista(&f, &(nuovo->head), &(nuovo->tail)))
return NULL;
return nuovo;
}
lista.c
struct lista{
LISTA next;
LISTA prev;
char codex[N+1];
char nome[MAXWORD+1];
char cognome[MAXWORD+1];
char data[N+1];
};
int alloc_lista(FILE ***fil, LISTA *testa, LISTA *coda)
{
LISTA nuovo, prec=NULL;
for(nuovo=*testa; !feof(**fil); nuovo=nuovo->next ){
nuovo=(LISTA)malloc(sizeof(struct lista));
if(nuovo==NULL)
return 0;
fscanf(**fil, "%s%s%s%s", nuovo->codex, nuovo->nome, nuovo->cognome, nuovo->data);
nuovo->next=NULL;
nuovo->prev=prec;
prec=nuovo;
}
*coda=prec;
return 1;
}
当我遍历列表以删除节点时我会使用sigsegv
的main.c
eliminazione(d);
dizionario.c
void eliminazione(DIZ diz)
{
elimina((diz)->head);
}
lista.c
void elimina(LISTA testa)
{
LISTA h;
char codice[N+1];
printf("inserisci il codice dell'elemento da eliminare: ");
scanf("%s", codice);
for(h=testa; h!=NULL; h=h->next){
if(strcmp(h->codex, codice)==0){ /*SIGSEGV WHILE COMPARING THE FIRST ELEMENT of the list!!!*/
h->prev->next=h->next;
free(h);
h=h->prev;
}
}
}
这是我试图阅读的文件
file.txt的
s201532 加布里埃莱 齐射 1994年5月3日 s225632 马特奥 turchetti 31/08/1994 s569874 布鲁诺 pinci 1994年5月9日 s564812 domenica 齐射 1981年9月2日 s114455 giovannina nasello 1950年5月4日 s379152 比安卡 流行的 26/04/1996 s478125 盖亚 ravazzolo 28/03/1996 s598741 弗朗切斯科 martoscia 24/06/1975 s700265 giuseppina 齐射 24/06/1977 s112598 埃内斯托 giliberto 25/12/1920
答案 0 :(得分:0)
在你的第一个方法中你首先释放h,然后尝试访问它。 你应该做这样的事情:
LISTA temp;
...
...
temp = h->prev;
free(h);
h = temp;
答案 1 :(得分:0)
这是来自libC的strcmp,所以如果你给strcmp一个NULL指针它就是segfault!
int
strcmp (const char *p1, const char *p2)
{
const unsigned char *s1 = (const unsigned char *) p1;
const unsigned char *s2 = (const unsigned char *) p2;
unsigned char c1, c2;
do
{
c1 = (unsigned char) *s1++;
c2 = (unsigned char) *s2++;
if (c1 == '\0')
return c1 - c2;
}
while (c1 == c2);
return c1 - c2;
}
它在" strcmp(h-> codex,codice)"如果h-> codex == NULL或者codice == NULL