Am Son, 2002-12-15 um 14.35 schrieb Terje Fåberg:
Jan Trippler skrev:
Node *root;
Du initialisierst root nicht, kannst also nicht sicher sein, dass da auch tatsächlich 0 drin steht. Besser: Node *root = NULL;
Das hoert sich eigentlich logisch an. Aber ich habe mir mit den Data Display Debugger die Baumstrucktur visualisieren lassen. Auch die nicht initialisierten Zeiger enthalten NULL. Kann es sein, dass der gcc die Zeiger auch ohne explicite Angabe initialisiert? Ja, zum Teil. Ist aber eigentlich Zufall, darauf verlassen darf man sich keinesfalls.
elem = malloc(sizeof(Node)); <--- immer hier
Hier sollte beim Compile eine Warnung kommen, da malloc() vom Typ void* ist. Besser einen typecast nutzen: elem = (Node *) malloc(sizeof(Node));
Ich bekomme mit "-Wall -pedantic" ohne und mit Cast keine Warnung. Logisch wäre es aber. Nein. Implizite Casts von void* nach typ* sind in C immer legal.
if( n->val == NULL ) { n->val = malloc(strlen(c)); [...] zusätzlich: Du reservierst hier IMHO zu wenig Platz, denn der nachfolgende strcpy kopiert das abschliessende NULL-Byte mit -
Genau! Das hat der Lauf mit MALLOC_CHECK_=1 auch ergaben. Das ist wirklich meine Blindheit und Dumm- heit. Bei der Gelegenheit: Schau dir mal strdup und calloc an.
Ralf