добавить элемент в список - PullRequest
0 голосов
/ 17 марта 2019

Я хочу знать, что является причиной ошибки сегментации 11. Я написал код для добавления нового элемента в список. Но он никогда не сможет успешно работать, и я также не знаю, как изменить мой код.

typedef struct ll{
    int val;
    struct ll *next;
}ll_t;

int main(int argc, const char * argv[]) {
    // insert code here...
    //int i;
    //int shmid;
    ll_t *list=NULL;
    //int *array=NULL;

    list=malloc(sizeof(ll_t));
    list->val=1;
    list->next=NULL;

    list->next->val=2;
    list->next->next=NULL;

    while(list->next!=NULL){
        printf("the number is: %d", list->val);
        list=list->next;
    }
    return 0;
}

Спасибо!

1 Ответ

0 голосов
/ 17 марта 2019

Ошибки сегментации возникают при попытке доступа к памяти, которая вам не принадлежит.

По словам авторов книги «Три простых пьесы» (это книга об операционных системах. Прекрасно читайте, кстати), ошибка сегментации - это просто причудливое слово:

ВЫ ЧТО-ТО НЕПРАВИЛЬНО ПАМЯТЬ, ТЫ ГЛАВНЫЙ ПРОГРАММИСТ, И Я ЗЛО.

list=malloc(sizeof(ll_t));
list->val=1;
list->next=NULL;    <----- This is where the problem starts.

Вы назначаете NULL на list->next. Это означает, что list->next now points to the memory location 0x0000`, который вам недоступен. Он используется для хранения некоторой базовой информации, которая требуется ОС для правильного запуска программы.

list->next->val=2;  <----- This is where the problem ends (your program with it)

Вы пытаетесь получить доступ к чему-то на 0x0000, что является большим нет-нет. Таким образом, операционная система обнаруживает это, останавливает вас и мешает уничтожить все, что ей нравится и о чем она заботится.

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