C ++ делает массив нулевым, используя foreach - PullRequest
0 голосов
/ 01 ноября 2018
Node* nodes[3];

for (Node* eachNode:nodes) {
    eachNode = 0; //if i try to dereference it gives seg fault
}                 // eg. *eachNode = 0;

if (nodes[0] == 0) {
    cout << "Null";
} else
    cout << "Not null";

cout << '\n';

Node* nodes2[3];

for (int i = 0; i < 3; ++i) { //this way works fine
    nodes2[i] = 0;
}

if (nodes2[0] == 0) {
    cout << "Null";
} else
    cout << "Not null";

Привет, ребята. Я пытаюсь сделать все мои объекты в массиве равными нулю. При использовании цикла for он работает нормально, но когда я использую цикл foreach, он прерывается.

Вывод, который я получаю

Не ноль

Нулевой

Я думаю, что мне нужно разыменовать узлы в цикле foreach, но это вызывает ошибку сегмента.

Кто-нибудь знает, что не так? спасибо.

Ответы [ 3 ]

0 голосов
/ 01 ноября 2018

Указатели передаются по значению. Поэтому установка eachNode = 0; изменит значение, в противном случае вы пытаетесь разыменовать сонет, который не является указателем.

0 голосов
/ 01 ноября 2018

Записанный вами цикл зацикливается на значениях массива:

for (Node* eachNode:nodes) {
    eachNode = 0;
}

Вышеприведенный цикл мог бы быть написан с использованием auto:

for (auto eachNode:nodes) {
    eachNode = 0;
}

Проблема с вышеуказанными циклами состоит в том, что eachNode является , а не указателем, хранящимся в массиве, но копией этого указателя, хранящимся в локальной переменной цикла.

Если вы хотите установить узел на нуль, вам нужна ссылка на область памяти, где вы хотите установить его . Вы получаете эту ссылку, ссылаясь на элемент массива, используя auto&:

for (auto& eachNode:nodes) {
    eachNode = 0;
}

Этот последний сегмент, скорее всего, будет делать то, что вы хотите.

0 голосов
/ 01 ноября 2018

Я считаю, что вместо этого вы должны попробовать:

for(Node *&eachNode : nodes) {
    eachNode = nullptr;
}

Таким образом, вы получаете ссылку, а не значение, и вы можете соответственно установить ее на nullptr.

Я не очень опытен в C ++ 11, но у меня было чтение здесь для получения дополнительной информации об этой новой конструкции диапазона.

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