Вложенный доступ структуры в C - PullRequest
0 голосов
/ 10 января 2019

Я не могу понять, почему мой код вызывает segfault, когда я пытаюсь сделать следующее:

typedef struct Vertex {
    int i;
    int color;
} vertex;

typedef struct Edge {
    vertex v1;
    vertex v2;
} edge;

typedef struct Node {
    vertex *v;
    struct Node *next;
} node;

node *nodehead = NULL;

код, вызывающий проблему здесь:

nodehead = malloc(sizeof(node));
if (nodehead == NULL) return -1;
nodehead->v->i = 10;
nodehead->next = NULL;

Может быть, я что-то упускаю, у большинства людей были проблемы, потому что они пытались использовать оператор -> на объекте. Кажется, попытка присвоить int полю fieldhead-> v-> i вызывает проблему.

Ответы [ 2 ]

0 голосов
/ 11 января 2019

Линия nodehead->v->i = 10; - это то, что доставляет вам проблемы.

Вы пытаетесь присвоить значение v, однако память для v не выделена. Решением было бы выделить память для v до достижения этой строки.

0 голосов
/ 10 января 2019

Нет памяти, выделенной для члена vertex вашего node. Либо выделите для него память так:

nodehead->v = malloc(sizeof(vertex));

перед назначением члена i, или, возможно, даже лучше, измените ваш структурный узел, чтобы он уже включал полный экземпляр вершины

typedef struct Node {
    vertex v;
    struct Node *next;
} node;

и доступ мне нравится так:

nodehead->v.i = 10;

Последний метод имеет то преимущество, что вам не нужно управлять памятью для двух объектов, а только для самого узла. OTOH, если ваши вершины используются независимо от связанного списка, этот метод может не подходить; это зависит от контекста.

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