2012-03-28 8 views
1

Ich habe die folgende Struktur und Funktion, die Dinge auf die Struktur fügt hinzu:Strukturen mit Streichern und Eingang

struct scoreentry_node { 
    struct scoreentry_node *next; 
    int score; 
    char* name;  
} 
; 

typedef struct scoreentry_node *score_entry; 

score_entry add(int in, char* n, score_entry en) {  
    score_entry r = malloc(sizeof(struct scoreentry_node)); 
    r->score = in; 
    r->name = n; 
    r->next = en; 
    return r; 
} 

ich habe Eingang, den es in der folgenden Hauptdatei nehmen:

int score; 
char name[]; 

int main(void) { 
score_entry readin = NULL; 

while(1) 
{ 

     scanf("%s%d", name, &score); 
     readin = add(score, name, readin); 
     // blah blah 

ich nicht weiß warum, aber wenn ein Name eingegeben wird, wird es zu readin hinzugefügt, aber wenn ich einen anderen Namen eingabe, haben alle Namen in diesen neuen Namen

zum Beispiel:

input: 
bob 10 
readin = 10 bob NULL 

jill 20 
readin = 20 jill 10 jill NULL 

Ich weiß nicht, warum Bob verschwindet ... irgendeinen Grund, warum es das tut?

Antwort

3

Sie speichern nur einen Zeiger auf die Namenszeichenfolge, nicht eine Kopie der Zeichenfolge selbst. Versuchen Sie strdup mit:

r->name = strdup(n); 

Nur sicher sein free(r->name), wenn ein Knoten zu befreien.

Eine Alternative wäre char* name zu char name[1] zu ändern, und etwas zu tun, wie folgt aus:

score_entry add(int in, char* n, score_entry en) {  
    score_entry r = malloc(sizeof(struct scoreentry_node) + strlen(n)); 
    r->score = in; 
    strcpy(r->name, n); 

    [..] 

Das spart einen separaten Teil des Speichers für die Zeichenfolge Zuweisung, aber beachten Sie, dass in diesem Fall namemuss sein am Ende deiner Struktur.

+0

Ich gehe mit dem Ändern von 'char * name' zu' char name [1] 'in der Struktur im Erhalten eines Compilerfehlers in meiner Funktion add 'inkompatible Typen beim Zuweisen zum Typ' char [1] 'vom Typ' char * "... wo genau würde ich 'strlen (name)' hinzufügen? – Thatdude1

+0

Ich habe etwas mehr Details hinzugefügt. –

+0

ahhh vielen Dank James! :) – Thatdude1