-2

我正在尝试用 C 编写一个小的双向链表程序,但由于某种原因,它给了我第一个元素的未定义行为。我希望它在开头有一个空单元格,用于链接第一个和最后一个元素。所以它是这样的:... <-> Second Last <-> Last <-> Empty Cell <-> First <-> Second <->...

第一个元素是随机值,但下一个元素有效。例如,如果我的输入文件是 1 2 3 4 5,则输出将为<undefined>2 3 4 5,其中 undefined 可以是 C 希望给我的任何数字。

奇怪的是,它在调试模式下也能完美运行(使用 MinGW Developer Studio,因为我从学校习惯了它)。它在 Linux 下也很好用(使用 gcc 进行编译)。

这是代码:

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

typedef struct Nod {
struct Nod *next, *ant;
int x;
} Nod_t, *List_t, **AList_t;

void PrintList (List_t sant){
List_t lista = sant->next;
while(lista != sant){
    printf("%i ", lista->x);
    lista = lista->next;
}
}

List_t PopulateList(char* fis){

List_t lista, sant;
int nr;
FILE *f = fopen(fis, "rt");

sant = (List_t)malloc(sizeof(List_t));
sant->next = sant->ant = NULL;
lista = sant;
//First node

while(!feof(f)){
    fscanf(f, "%i", &nr);
    lista->next = (List_t)malloc(sizeof(List_t));
    lista->next->x = nr;
    lista->next->ant = lista;
    lista = lista->next;
}

sant->ant = lista;
lista->next = sant;

return sant;

}

int main (){

List_t lista1;
lista1 = PopulateList("1.txt");
PrintList(lista1);
return 0;
}

更好的缩进在这里: http: //pastebin.com/NVQqaYHK

4

2 回答 2

1

尝试更改您的 malloc

sant = (List_t)malloc(sizeof(List_t));

sant = malloc(sizeof(Nod_t));

sant = malloc(sizeof(List_t));返回一个指向指针大小的区域的指针。

sant = malloc(sizeof(Nod_t));返回指向 Nod_t 大小的区域的指针。

顺便说一句,这是样式问题,但是您的类型别名令人困惑,并且可能导致您在 malloc 中的拼写错误。我建议只使用 Nod_t 类型并摆脱 List_t 和 AList_t。考虑这些声明:

List_t foo; // is this a pointer or a struct? Can't tell from the decl, need to know the typedef.
Nod_t *foo; // obviously a pointer

另请参阅 Zack 的建议,尤其是关于 feof() 问题。

于 2013-09-11T17:05:51.697 回答
1

错误在这里:

sant = (List_t)malloc(sizeof(List_t));
sant->next = sant->ant = NULL;
lista = sant;

您没有初始化sant->x,因此您在列表中有一个条目(在包含文件中真实数据的所有条目之前x)具有未初始化的.

当您稍后打印出列表中x所有条目时,会触发未定义的行为(在 Linux 和 Windows 上,要清楚;未定义的行为包括打印的值始终为零的可能性)。

您应该在显示的代码之后立即重构循环,以便在您读取文件中的第一行之前不会分配列表中的第一个条目,并且您没有未初始化的初始列表条目价值。

您还需要 Charlie Burns 提到的错误修复。

于 2013-09-11T17:08:24.823 回答