我有以下结构和功能,可以为结构添加内容:
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
我不知道鲍勃为什么会消失......为什么会这样做?
答案 0 :(得分:3)
您只是存储指向名称字符串的指针,而不是字符串本身的副本。尝试使用strdup
:
r->name = strdup(n);
释放节点时确保free(r->name)
。
另一种方法是将char* name
更改为char 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
必须位于结构的末尾。