从文件分配列表时出现分段错误

时间:2014-12-02 10:19:43

标签: c list file memory-management segmentation-fault

在此程序中,我插入从列表中的文件读取的值。在标题中有句柄

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

2 个答案:

答案 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