-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

特に feof() の問題に関しては、Zack の提案も参照してください。

于 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 に答える