2014-11-14 2 views
0
---------- 
#include <stdio.h> 
#include <stdlib.h> 
#include <string.h> 

struct node { 
    char *val; 
    struct node *next; 
}; 

void add_to_list(struct node **, char *); 
void list_all_elements(struct node *); 

int main (int argc, char **argv) 
{ 

    char *val; 
    struct node *head = NULL; 

    do { 

     scanf("%s",val); 
     add_to_list(&head, val); 

    } 
    while(val[0] != '\\'); 

    list_all_elements(head); 
} 

void add_to_list(struct node **head, char *val) 
{ 
    //This produces a segfault 
    struct node *temp = malloc(sizeof *temp); 

    //EDIT - Fixed as per comments 
    temp->val = malloc(strlen(val) + 1); 

    strcpy(temp->val, val); 
    temp->next = NULL; 

    if(head!=NULL) 
     temp->next = *head; 

    *head = temp; 

} 

void list_all_elements(struct node *head) 
{ 

    while(head!=NULL) { 

     printf("%s\n",head->val); 
     head = head->next; 
    } 
} 

Так вот что я скомпилировал для реализации связанного списка. Теперь, по какой-то причине malloc'ing создает ошибку сегментации.Связанный список на основе строк в C вызывает ошибку сегментации

Конечно, я заменил char * на char [], и код работает нормально. Из-за этого возникает ошибка malloc или есть какая-то тривиальная ошибка, которую я не могу найти?

+0

голова не будет нулевой, вы должны проверить * head, но это не изменится все это означает, что каждый раз, когда вы назначаете temp-> next = * head; это то, что вам нужно, вам совсем не нужно (и temp-> next = NULL) – Teudimundo

+0

1) 'char * val;' -> 'char val [MAX_STRING_SIZE];' – BLUEPIXY

ответ

1

Вы не выделили память, на которую указана переменная val, и где вы собираетесь читать строку.

char *val; 

//... 

do { 

    scanf("%s",val); 
    add_to_list(&head, val); 

} 

Переменная val не была инициализирована, поэтому программа имеет неопределенное поведение.

И функция add_to_list недействительна. Например, sizeof(val) всегда имеет такое же значение, которое равно размеру указателя на char. Он не дает размер строки, на которую указывает этот указатель. Вместо оператора sizeof вы должны использовать функцию strlen

функция может быть записана как

void add_to_list(struct node **head, const char *val) 
{ 
    struct node *temp = malloc(sizeof *temp); 

    size_t n = strlen(val); 

    temp->val = malloc(n + 1); 
    strcpy(temp->val, val); 

    temp->next = *head; 

    *head = temp; 
} 
+0

Это! Спасибо! Это было наивно! – user3576305

+0

Но не следует ли сканировать, там есть ошибка? – user3576305

+0

@ user3576305 Программа имеет неопределенное поведение, поэтому не предсказуемо, что произойдет. –

1
temp->val = malloc(sizeof(val)); 

Изменение sizeof(val) к strlen(val)+1.

+1

strlen () +1 или у вас не останется места для записи \ 0 – Teudimundo

+0

@Teudimundo: Исправлено, спасибо. – Kevin

+0

Я попробовал strlen (val) + 1. Все еще ошибки – user3576305

2

Вы не выделить Валу в главном

char *val; 
... 
scanf("%s",val); 

но здесь val не выделяется, когда вы делаете scanf собирается sigsegv

+0

Да! Это было. Спасибо. – user3576305

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