PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : [C] Testprogramm zu Modul stürzt ab!



Deever
02-03-2004, 09:23
Hey Amigos, wie geht's?

Ich habe ein C-Modul geschrieben, das die Sortierung von Struct-Arrays und verketteten Listen vereinfachen soll, und eine Testimplementation dafür. Beides lässt sich ohne Fehlermeldungen kompilieren, aber fish.c kackt immer mit nem Segfault ab, soweit ich das mit gdb beurteilen kann bei Zeile 98!

Kann mir jemand helfen? Ich kenn mich mit Pointern nämlich noch nicht sooo gut aus!:(
Gruß,
dev

micha
02-03-2004, 20:03
Hi,

mit -Wall compiliert kamen mehrere Warnungen:



micha@asus:~/bubble.org> gcc -Wall -g -o bubbelfish bubblefish.c fish.c
bubblefish.c: In function `bubblefish':
bubblefish.c:37: warning: suggest parentheses around assignment used as truth value
bubblefish.c:43: warning: suggest parentheses around assignment used as truth value
bubblefish.c:61: warning: suggest parentheses around assignment used as truth value
bubblefish.c:76: warning: `return' with no value, in function returning non-void
fish.c: In function `main':
fish.c:42: warning: missing braces around initializer
fish.c:42: warning: (near initialization for `arel[0]')
fish.c:46: warning: unused variable `lilinext'
fish.c:50: warning: unused variable `dolilinext'


- Die ersten drei Warnungen sind wegen einer Zuweisung statt einem Vergleich.
- In der Funktion bubblefish wird nichts zurückgegeben, Du weist aber in fish.c 112,113 lili und
dolili den nicht vorhandenen Rückgabewert zu.

Dein Programm stürzt nach dem ersten Durchlauf der for-schleife (97) ab, da die Initialisierung in den 2 for-schleifen davor nicht ganz korrekt ist:



lilistart = (linkedlistelement_t*) malloc(sizeof(linkedlistelement_t));
dolilistart = (doublylinkedlistelement_t*) malloc(sizeof(doublylinkedlistelement_t));

for ( i=1; i<3; i++) {
lili = (linkedlistelement_t*) malloc(sizeof(linkedlistelement_t));
/*
* In jedem Durchlauf der Schleife wird lilistart->next erneut alloziierter Speicher
* zugewiesen, anstatt beim zweiten Durchlauf lilistart->next->next, etc...
*/
lilistart->next = lili;
}

for ( i=1; i<3; i++) {
doliliprev = dolili;
dolili = (doublylinkedlistelement_t*) malloc(sizeof(doublylinkedlistelement_t));
dolilistart->next = dolili;
dolili->prev = doliliprev;
}

lili = lilistart;
dolili = dolilistart;


Vorschlag:



lili = lilistart = (linkedlistelement_t*) malloc(sizeof(linkedlistelement_t));
dolili = dolilistart = (doublylinkedlistelement_t*) malloc(sizeof(doublylinkedlistelement_t));

dolili->prev = NULL;

for ( i=1; i<3; i++)
{
lili->next = (linkedlistelement_t*) malloc(sizeof(linkedlistelement_t));
lili = lili->next;

dolili->next = (doublylinkedlistelement_t*) malloc(sizeof(doublylinkedlistelement_t));
dolili->next->prev = dolili;
dolili = dolili->next;
}

lili = lilistart;
dolili = dolilistart;


Damit läuft das Programm zumindest bis nach der dritten for-Schleife ;)
Abstürzen tuts jetzt in bubblefish.c Zeile 52.
Weiter bin ich jetzt noch nicht, aber vielleicht hilft Dir das schonmal.

Gruß micha