2012-03-28 22 views
1

我有以下的结构和功能,增加东西向结构:结构用绳子和输入

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; 
} 

我有把它在以下主要文件输入:

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 

我不知道为什么,但在输入它被添加到readin一个名字,但是当我输入另一名readin所有名称有这个新名字

例如:

input: 
bob 10 
readin = 10 bob NULL 

jill 20 
readin = 20 jill 10 jill NULL 

我不知道bob为什么会消失......任何理由为什么会这样做?

回答

3

您只是存储一个指向名称字符串的指针,而不是字符串本身的副本。尝试使用strdup

r->name = strdup(n); 

释放一个节点时,只要确保free(r->name)

另一种方法是改变char* namechar name[1],做这样的事情:

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); 

    [..] 

这样可以节省分配独立的存储块的字符串,但要注意,在这种情况下name必须是在你的结构的末尾。

+0

即时通过将'char * name'更改为'char name [1]'在struct im中获取编译器错误在我的函数中添加'不兼容的类型'从char *类型分配类型'char [1]'时' ''...我会在哪里添加'strlen(name)'? – Thatdude1 2012-03-28 23:24:34

+0

我增加了一些细节。 – 2012-03-28 23:27:00

+0

ahhh非常感谢詹姆斯! :) – Thatdude1 2012-03-28 23:29:41