@gosha_tst

Почему Segmentation fault?

Делаю реализацию списка на С (просто ради интереса). У меня два вопроса: почему Segmentation fault и насколько это говнокод?)

#include <stdio.h>

typedef struct Node {
    struct Node* next;
    int value;
} Node;

typedef struct List {
    Node* head;
    Node* list[10];
} List;

void newNode(List* change_list, int value) {
    int size = sizeof(change_list)/sizeof(*change_list);

    if (size == 0) {
        Node* new_node;
        new_node->next = NULL; // здесь
        new_node->value = value; // и здесь вываливается ошибка
        change_list->list[size] = new_node;
        change_list->head = change_list->list[0];
    }
}

void main() {
    List* new_list;
    newNode(new_list, 5);
    printf("%d", new_list->list[0]->value);
}
  • Вопрос задан
  • 71 просмотр
Решения вопроса 2
myjcom
@myjcom
#include <stdio.h>
#include <stdlib.h>

typedef struct Node {
    struct Node* next;
    int value;
} Node;

typedef struct List {
    Node* head;
    Node* list[10];
} List;

void newNode(List* change_list, int value) {
    int size = sizeof(change_list)/sizeof(*change_list);

    if (size == 0) {
        Node* new_node = (Node*)malloc(sizeof(Node));
        new_node->next = NULL; // здесь
        new_node->value = value; // и здесь вываливается ошибка
        change_list->list[size] = new_node;
        change_list->head = change_list->list[0];
    }
}

int main() {
    List* new_list = (List*)malloc(sizeof(List));
    newNode(new_list, 5);
    printf("%d", new_list->list[0]->value);
}


https://ru.stackoverflow.com/questions/245369/Вопр...

eще free() для List и
каждого узла нужно будет вызвать.
Ответ написан
CityCat4
@CityCat4 Куратор тега C
//COPY01 EXEC PGM=IEBGENER
Чего удивительного-то?
Node* new_node;
завели указатель на структуру Node. Который указывает в никуда, то есть по случайному адресу, который там будет записан. Нужно вот так:
Node* new_node = (Node *) calloc((sizeof(Node),1);
Это сразу и память выделит и проинициализирует ее нулями.
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы