Форум программистов, компьютерный форум CyberForum.ru

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
Рейтинг: Рейтинг темы: голосов - 35, средняя оценка - 4.69
Tamoren
0 / 0 / 0
Регистрация: 08.01.2012
Сообщений: 37
#1

Нулевой указатель - C++

09.01.2012, 05:26. Просмотров 4767. Ответов 12
Метки нет (Все метки)

Что происхот при:
C++
1
2
    int* p = NULL;
    cout << *p;
Другими словами, на что ссылается нулевой указатель? Компилятор ошибок не выдает.
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
DU
1480 / 1056 / 45
Регистрация: 05.12.2011
Сообщений: 2,279
09.01.2012, 05:28     Нулевой указатель #2
ни на что не ссылается. поведение при разыменовывании нулевого указателя неопределено. в рантайме скорее всего покрашится все.
Tamoren
0 / 0 / 0
Регистрация: 08.01.2012
Сообщений: 37
09.01.2012, 05:50  [ТС]     Нулевой указатель #3
То есть зависит от того, что решит компилятор делать с этим чудом?
Chelioss
179 / 179 / 4
Регистрация: 08.01.2011
Сообщений: 1,133
09.01.2012, 05:55     Нулевой указатель #4
Цитата Сообщение от Tamoren Посмотреть сообщение
То есть зависит от того, что решит компилятор делать с этим чудом?
Компилятор только компилирует, т.е. создает программу. Программа запускается без компилятора.
easybudda
Эксперт С++
9439 / 5462 / 925
Регистрация: 25.07.2009
Сообщений: 10,481
09.01.2012, 05:55     Нулевой указатель #5
Цитата Сообщение от Tamoren Посмотреть сообщение
То есть зависит от того, что решит компилятор делать с этим чудом?
Компилятор ничего не решит, в лучшем случае предупреждение выдаст. А вот при выполнении программа грохнется с null pointer exception, о чём уже выше сказали. Опять же - а дописать, скомпилировать, запустить и посмотреть, что будет - не?
C++
1
2
3
4
5
6
7
8
9
#include <iostream>
using namespace std;
 
int main(){
    int * p = NULL;
    cout << *p;
     
    return 0;
}
Код
~/cpp/other $ g++ -o nullpointerexception nullpointerexception.cpp 
~/cpp/other $ ./nullpointerexception 
Bus error
~/cpp/other $
Tamoren
0 / 0 / 0
Регистрация: 08.01.2012
Сообщений: 37
09.01.2012, 06:05  [ТС]     Нулевой указатель #6
Цитата Сообщение от easybudda Посмотреть сообщение
Опять же - а дописать, скомпилировать
Дописал, скомпилировал - без предупреждений и ошибок. Запускать не решился Я же не знаю произойдет после запуска.
А почему же все-таки этот код компилируется?

Цитата Сообщение от Chelioss Посмотреть сообщение
Компилятор только компилирует, т.е. создает программу.
Ну так я только и скомпилировал, а неопределенность, как я понимаю, означает, что на разных платформах может быть по разному.
easybudda
Эксперт С++
9439 / 5462 / 925
Регистрация: 25.07.2009
Сообщений: 10,481
09.01.2012, 06:18     Нулевой указатель #7
Цитата Сообщение от Tamoren Посмотреть сообщение
Запускать не решился
Не, ну комп взорваться не должен...

Цитата Сообщение от Tamoren Посмотреть сообщение
а неопределенность, как я понимаю, означает, что на разных платформах может быть по разному
Можно и так сказать. Несколько удивило поведение в dosbox
Нулевой указатель
easybudda
Эксперт С++
9439 / 5462 / 925
Регистрация: 25.07.2009
Сообщений: 10,481
09.01.2012, 06:25     Нулевой указатель #8
Цитата Сообщение от easybudda Посмотреть сообщение
Несколько удивило поведение в dosbox
Чем дальше в лес, тем толще партизаны
Нулевой указатель
Tamoren
0 / 0 / 0
Регистрация: 08.01.2012
Сообщений: 37
09.01.2012, 07:00  [ТС]     Нулевой указатель #9
Цитата Сообщение от easybudda Посмотреть сообщение
Несколько удивило поведение в dosbox
Эээ это у него указатель на 0 равен нулю?

Цитата Сообщение от easybudda Посмотреть сообщение
Чем дальше в лес, тем толще партизаны

NPE.EXE это скомпилированный NPE.CPP, тот что на экране? По идее (ну раз в 1 случае - 0) должен был 1 написать. Wtf?!
taras atavin
Ушёл с форума.
3569 / 1752 / 91
Регистрация: 24.11.2009
Сообщений: 27,619
09.01.2012, 08:19     Нулевой указатель #10
Цитата Сообщение от Tamoren Посмотреть сообщение
Другими словами, на что ссылается нулевой указатель? Компилятор ошибок не выдает.
Комилятор не среагирует при любом значении, так как вообще не его дело заниматься значениями. Строка
C++
1
cout<<*p;
компилится отдельно ото всего остального, кроме декларации одного лишь типа величины p, то есть кроме
C++
1
int* p;
, игнорируя инициализацию, а будучи вырванной из контекста, ошибок не содержит. Ошибка может быть только в рантайме, так что запусти и любуйся красивым глюком.
go
Эксперт C++
3586 / 1366 / 128
Регистрация: 16.04.2009
Сообщений: 4,528
09.01.2012, 11:06     Нулевой указатель #11
Цитата Сообщение от Tamoren Посмотреть сообщение
Что происхот при:
В стандарте этот момент не оговорен. Это Undefined behavior. Разыменование нулевых указателей, которые равны NULL, может дать 0, или любое произвольное значение, или остановку программы, или сигнал какого-либо вида, или исключение. Или все вместе. Или что-то еще.

Добавлено через 50 минут
Цитата Сообщение от Tamoren Посмотреть сообщение
Эээ это у него указатель на 0 равен нулю?
И такое возможно
Evg
Эксперт CАвтор FAQ
17382 / 5620 / 350
Регистрация: 30.03.2009
Сообщений: 15,398
Записей в блоге: 26
09.01.2012, 12:11     Нулевой указатель #12
Цитата Сообщение от easybudda Посмотреть сообщение
Несколько удивило поведение в dosbox
В dos'е используется real-mode, в котором нету современных настроек страничной памяти. Т.е. вся память в пределах 1 мегабайта является валидной.

Добавлено через 58 секунд
Не в dos'е, а в dos'овских компиляторах. По умолчанию генерируется код под real-mode.

Добавлено через 55 секунд
Правда второй пример это не объясняет... Разве что эта область памяти защищена для записи (т.е. читать можно, а писать - нет)
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
09.01.2012, 16:10     Нулевой указатель
Еще ссылки по теме:

Почему указатель на указатель объявляется как float **A; C++
C++ Как работает нулевой указатель null
Как работает нулевой указатель? C++
Заставить указатель указывать на нулевой элемент массива C++
C++ Нулевой указатель на объект

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

Или воспользуйтесь поиском по форуму:
Tamoren
0 / 0 / 0
Регистрация: 08.01.2012
Сообщений: 37
09.01.2012, 16:10  [ТС]     Нулевой указатель #13
Да, спасибо. Это я уже примерно понял.

Только врубиться не могу, как такое в DOSBox'е получилось?
Yandex
Объявления
09.01.2012, 16:10     Нулевой указатель
Ответ Создать тему
Опции темы

Текущее время: 07:50. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru