Инициализировать указатель на объект - PullRequest
0 голосов
/ 30 января 2019

Данный объект, например listNode.

Если я инициализирую указатель на объект с помощью:

listNode* head_node;

Чем это отличается от

listNode* head_node = NULL;

Ответы [ 2 ]

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

В первом случае вы объявляете переменную-указатель.Во втором случае вы объявляете переменную-указатель и инициализируете ее NULL.Любая переменная, которая объявлена, но не инициализирована, приводит к неопределенному поведению при попытке доступа к переменной.Это не имеет ничего общего с указателями, указатели, как и любая другая переменная.Например, если вы напишите int a;, а затем cout << a;, вы увидите, что в a, скорее всего, записано случайное целочисленное значение.Но если вы напишите int a = 0;, а затем cout << a;, вы увидите, что a всегда равно 0 на любом компиляторе на любой машине.Это хорошо определенное поведение, а не неопределенное поведение.

Я бы не рекомендовал использовать необработанные указатели в вашем случае, так как вы, скорее всего, хотите, чтобы они всегда были инициализированы как nullptr, плюс ваш listNode, скорее всего, наиболее вероятен."принадлежит" самому списку.Попробуйте вместо этого использовать std::unique_ptr<listNode>: он по умолчанию инициализирует указатель на nullptr и освободит выделенную память, когда указатель выйдет из области видимости, что означает, что если заголовок списка будет удален, все остальные узлы всписок также будет автоматически удален.

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

В первом случае listNode* head_node; компилятор выделит некоторую память для хранения указателя.Эта память может содержать любое значение (например, это может быть какое-то случайное значение, когда это место использовалось для чего-то другого), и, фактически, чтение его приведет к неопределенному поведению.

Во втором случае listNode* head_node = NULL; компилятор выделит некоторую память для хранения указателя, а затем запишет NULL в это место, так что указатель гарантированно будет NULL.

Заметьте, вы должны использовать nullptr какв отличие от NULL.См. этот ответ , почему.

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