Как хранить узел в массиве C ++? - PullRequest
0 голосов
/ 04 апреля 2020

Разве это не способ сохранить узел в массиве? Когда я пытаюсь запустить его, я получаю ошибку сегментации. Я знаю, что это происходит, если вы пытаетесь получить доступ к памяти, на которую у вас нет разрешения. В этом коде я не назначаю узел в массиве и не печатаю его данные?

struct Node{
    int data;
    struct Node* next;
};
struct Node* head = NULL;
int main(){
    struct Node* arr[10];
    head->data = 2;
    head->next = NULL;
    arr[1] = head;
    std::cout << arr[1]->data;

}

1 Ответ

4 голосов
/ 04 апреля 2020

Вы имеете дело не с Nodes здесь, а с Node указателями. Они не указывают на действительную память, если вы не выделите ее.

Кроме того, не используйте NULL, вместо этого используйте nullptr.

head = nullptr;
head->data = 42; // this is UB, could be a segfault

Если вы хотите это сделать , вы должны выделить его

head = new Node{};
head->data = 42; //ok

Тот же лог c применяется для arr

arr[1] = new Node{}; // now arr[1] is pointing to valid memory

Я не уверен, почему вам нужен массив указателей Node, хотя , Ваша Node структура выглядит как обычный узел связанных списков, и есть тег linked-list, поэтому я предполагаю, что вы хотите реализовать связанные списки.

В этом случае вам не нужно массив указателей узлов вообще. Весь связанный список должен быть подключен через head.

Если вы просто хотите получить массив узлов, вы можете это сделать, и вообще не беспокоиться о выделении памяти.

Node arr[10] {};
arr[1].data = 42; // ok
...