C语言 这段代码在Windows上给了我未定义的行为,但在Linux上工作正常



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

第一个元素是随机值,但下一个元素有效。例如,如果我的输入文件是 1 2 3 4 5,则输出将是 2 3 4 5 <undefined>,其中 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

尝试将 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大小的区域的指针。

顺便说一下,这是一个风格问题,但您的类型别名令人困惑,并可能导致您在 mallocs 中的拼写错误。我建议只使用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()问题的建议。

错误在这里:

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

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

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

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

您还需要查理伯恩斯提到的错误修复。

相关内容

  • 没有找到相关文章

最新更新