On Sam, 14 Dez 2002 at 11:22 (+0100), Terje Fåberg wrote: [segfault] Ich weiss nicht, ob es die Ursache ist, aber ich sehe Probleme an folgenden Stellen:
struct node { char *val; int count; struct node *left; struct node *right; };
typedef struct node Node;
Node *root;
Du initialisierst root nicht, kannst also nicht sicher sein, dass da auch tatsächlich 0 drin steht. Besser: Node *root = NULL;
Node *new_node() { Node *elem; 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)); Initialisieren (Grund siehe unten): memset (elem, 0, sizeof (Node));
elem->count = 0;
Die Zeile kann entfallen, wenn Du per memset() initialisierst.
return(elem); }
void insert_item(Node *n, char *c) { int cmp;
if( n->val == NULL ) { n->val = malloc(strlen(c));
Hier ebenfalls einen typecast einsetzen und zusätzlich: Du reservierst hier IMHO zu wenig Platz, denn der nachfolgende strcpy kopiert das abschliessende NULL-Byte mit - überschreibt also nicht zu n->val gehörenden Speicher. n->val = (char *) malloc(strlen(c) + 1);
strcpy(n->val,c); return; }
cmp = strcmp(n->val, c);
if(cmp > 0) { if(n->left == NULL)
Diese Abfrage ist gefährlich, da Du n ja per malloc() erzeugt hast und malloc() den reservierten Speicher nicht initialisiert. Es ist nach einem malloc() also nicht sicher, dass die Pointer NULL sind. Abhilfe: Entweder nach dem malloc initialisieren (siehe oben) oder calloc() benutzen.
n->left = new_node(); insert_item(n->left, c); return; } else if(cmp < 0) { if(n->right == NULL)
Dito.
n->right = new_node(); insert_item(n->right, c); } else { n->count++; }
}
HTH Jan