2013-09-05 2 views
0

Я использую структуру как связанный список, но с недавнего изменения (я забыл проверить в git-репо, поэтому не помню , который меняет) одна из моей структуры переменные в элементе head меняются. При выполнении кода, показанного ниже, post-> filename получил допустимую строку, но после выхода из метода head_post-> filename (который должен указать на то же самое значение) имеет добавленный мусор. Строка «20130804-0638.md» станет «20130804-0638.md : \ 020».C связанный список: голова меняется

Любая идея, что я пропустил?

Struct:

struct posting { 
    char *filename; 
    char timestamp[17]; 
    char *url; 
    char *title; 
    char *html; 
    struct posting *next; 
}; 
struct posting *head_post = NULL; 

Код:

struct posting *post; 
... 
while ((ep = readdir(dp))) { 
    if (ep->d_name[0] != '.' && strstr(ep->d_name, ".md") && strlen(ep->d_name) == 16) { 
    if (head_post == NULL) { 
     head_post = malloc(sizeof(struct posting)); 
     post = head_post; 
    } else { 
     post = head_post; 
     while (post->next != NULL) 
     post = post->next; 
     post->next = malloc(sizeof(struct posting)); 
     post = post->next; 
    } 

    post->filename = malloc(sizeof(char) * strlen(ep->d_name)); 
    strcpy(post->filename, ep->d_name); 
    post->next = NULL; 
    } 
} 
+0

Если вы загрузите последнюю версию из репо, вы сможете получить разницу двух файлов, которые будут выделять изменения. ... Если вы не забыли сделать это во многих изменениях. –

ответ

2

Я думаю, что нужно рассчитывать на '\0', а при выделении памяти для filename, поскольку strlen() не рассчитывать на него.

... 
//           ------------- +1 for '\0' 
post->filename = malloc(sizeof(char) * (strlen(ep->d_name) +1)); 
strcpy(post->filename, ep->d_name); 
post->next = NULL; 
... 
+0

Я делал это большую часть времени, и теперь я даже не думал об этом. Благодаря! – braindump

Смежные вопросы