Структуры со строками и вводом - PullRequest
1 голос
/ 29 марта 2012

У меня есть следующая структура и функция, которая добавляет вещи в структуру:

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

Я не знаю, почему Боб исчезает ... есть причина, почему он это делает?

1 Ответ

3 голосов
/ 29 марта 2012

Вы просто храните указатель на строку имени, а не копию самой строки. Попробуйте использовать 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 должно находиться в конце вашей структуры.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...