【发布时间】:2013-09-11 16:45:06
【问题描述】:
我正在尝试用 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
【问题讨论】:
-
UB 与语言相关,而不是与操作系统相关(好吧,或多或少,无论如何)。如果它是 Windows 上的 UB,那么它也可能是 Linux 上的 UB。您可能想将您的标题改写为“此代码在 Windows 上崩溃但在 Linux 上没有崩溃,我认为它调用了 UB”。此外,格式化您的代码(空格、缩进等),因为很难按原样阅读。此外,决定您使用哪种语言编写程序。 这是 C XOR C++?它不能同时是两者,它们是非常不同且不同的语言。
-
@PirvuMihai-Cristian "Linux 上的未初始化变量设置为 0"
-
@PirvuMihai-Cristian 你只是(不)幸运。
-
@PirvuMihai-Cristian C++ 不是 C 的超集,它是具有许多不同规则的完全不同的语言。例如
int *x = malloc(sizeof(int));是合法的 C,但在 C++ 中会导致编译时错误。 -
我很好奇,fopen(x, "rt") 中的“t”是什么意思?
标签: c list linked-list mingw