3 / 3 / 1
Регистрация: 26.04.2016
Сообщений: 69
1

Не выводит строку из-за нулевого указателя

12.09.2017, 18:12. Показов 988. Ответов 8
Метки нет (Все метки)

Здравствуйте, почему не выводит даже значение указателя b, когда я в cout добавляю указатель a (Без а, все работает).
C++ (Qt)
1
2
3
4
5
6
7
8
9
10
11
12
int main()
{
    int* a = new int[20];
    for (int i = 0; i < 20; ++i)
        a[i] = i;
    int* b = a;
    a = nullptr;
 
    cout << b[2] << *a << endl;
 
    return 0;
}
__________________
Помощь в написании контрольных, курсовых и дипломных работ, диссертаций здесь
0
Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
12.09.2017, 18:12
Ответы с готовыми решениями:

Обнаружением нулевого указателя
Делаю алгоритм Хаффмана. Возникла проблема при построении таблицы соответствий. void MakeT...

Разыменование нулевого указателя
Как вообще по стандарту ведет себя программа после разыменования нулевого указателя? Указано-ли это...

Проверьте правильность нулевого указателя
Задание: Напишите программу с блуждающим указателем. Исправьте программу чтобы блуждающий, стал...

Бинарные деревья. Ошибка нулевого указателя
При выполнении программы возникла следующая ошибка: ptr было nullptr. Что это значит и как ее...

8
зомбяк
1562 / 1211 / 344
Регистрация: 14.05.2017
Сообщений: 3,925
12.09.2017, 18:19 2
Цитата Сообщение от dima19972525 Посмотреть сообщение
когда я в cout добавляю указатель a
А зачем его добавляешь, да ещё и разыменовываешь? Он же указывает вникуда после a = nullptr;.

И кто за тебя память освобождать будет?
0
nd2
3431 / 2810 / 1249
Регистрация: 29.01.2016
Сообщений: 9,426
12.09.2017, 18:20 3
Лучший ответ Сообщение было отмечено dima19972525 как решение

Решение

Цитата Сообщение от dima19972525 Посмотреть сообщение
почему
Потому, что UB.
0
3 / 3 / 1
Регистрация: 26.04.2016
Сообщений: 69
12.09.2017, 19:03  [ТС] 4
Я сделал это просто из-за интереса, я не спрашиваю: Я все правильно делаю? Я спрашиваю: почему?
0
nd2
3431 / 2810 / 1249
Регистрация: 29.01.2016
Сообщений: 9,426
12.09.2017, 19:14 5
Цитата Сообщение от dima19972525 Посмотреть сообщение
не выводит даже значение указателя b,
Порядок действий здесь не определён:
Цитата Сообщение от dima19972525 Посмотреть сообщение
C++
1
cout << b[2] << *a << endl;
Сделай так - выведет b[2]:
C++
1
2
cout << b[2] << endl;
cout << *a << endl;
0
зомбяк
1562 / 1211 / 344
Регистрация: 14.05.2017
Сообщений: 3,925
13.09.2017, 01:06 6
Но выпадет на cout << *a, потому что a указывает на невыделенную область памяти c адресом 0
0
Велосипедист...
352 / 219 / 73
Регистрация: 15.12.2015
Сообщений: 785
13.09.2017, 01:45 7
Цитата Сообщение от dima19972525 Посмотреть сообщение
C++
1
a = nullptr;
Этот кусок кода говорит: "Окей, теперь a указывает в никуда".
Потом ты берешь и:
Цитата Сообщение от dima19972525 Посмотреть сообщение
C++
1
cout << b[2] << *a << endl;
"Добавь в поток два целых числа: 1) находится в b[ 2 ]; 2) находится нигде".
Если второе находится нигде, то что вставлять? Но вставить что-то нужно. И вот программа может попытаться взять какое-то значение из любой ячейки памяти. Может совпасть так, что взялось то значение, которое Вам нужно, а могло взяться рандомное. Могло случиться так, что ОС закрыла процесс, из-за того, что Вы попытались прочитать данные, которые не относятся к Вашей программе. Мог Дед Мороз упасть с крыши. Вам такое нужно? Дедушку жалко.
Вывод: нельзя применять оператор разыменования ( * ) к указателю, который указывает на 0, NULL, nullptr.

Добавлено через 5 минут
Цитата Сообщение от TRam_ Посмотреть сообщение
c адресом 0
Не обязательно. Нулевой указатель просто гарантированно не равен указателю на любые данные или функцию.
0
Любитель чаепитий
3726 / 1786 / 561
Регистрация: 24.08.2014
Сообщений: 5,983
Записей в блоге: 1
13.09.2017, 06:09 8
Цитата Сообщение от Captain Maxee Посмотреть сообщение
Вывод: нельзя применять оператор разыменования ( * ) к указателю, который указывает на 0, NULL, nullptr.
в определенных случаях можно.
C++
1
2
3
4
5
6
7
8
9
#include <iostream>
 
int main()
{
    int val = 10;
    int * ptr = nullptr;
    decltype(*ptr) ref = val; // ok
    ref = sizeof(*ptr);       // ok
}
но это не точно, я не помню, что стандарт на этот счёт говорит.
но, если это UB, то моей логике это не поддаётся.
2
16087 / 8687 / 2122
Регистрация: 30.01.2014
Сообщений: 14,973
13.09.2017, 08:46 9
Цитата Сообщение от GbaLog- Посмотреть сообщение
если это UB, то моей логике это не поддаётся
Нет, не UB.
См. unevaluated expressions.
Например тут: http://en.cppreference.com/w/c... xpressions
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
13.09.2017, 08:46
Помогаю со студенческими работами здесь

Почему не происходит разыменования нулевого указателя?
вот думаю, почему сия конструкция не вылетает: #define offsetof(type, member)...

Null или 0 для нулевого указателя
Здравствуйте. Появился вопрос что использовать лучше для создания нулевого указателя null или 0?

Вызов delete для нулевого указателя
Здравствуйте. Прочитал про конструктор переноса, в котором при копировании, необходимо обнулить все...

Возвращение неконстантного указателя из константного указателя на строку
Не могу до конца понять один момент. Допустим, у нас есть функция searchSymbol, которая принимает...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
9
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2022, CyberForum.ru