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

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

Восстановить пароль Регистрация
 
Рейтинг: Рейтинг темы: голосов - 35, средняя оценка - 4.69
Tamoren
0 / 0 / 0
Регистрация: 08.01.2012
Сообщений: 37
09.01.2012, 05:26     Нулевой указатель #1
Что происхот при:
C++
1
2
    int* p = NULL;
    cout << *p;
Другими словами, на что ссылается нулевой указатель? Компилятор ошибок не выдает.
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
DU
1477 / 1053 / 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,131
09.01.2012, 05:55     Нулевой указатель #4
Цитата Сообщение от Tamoren Посмотреть сообщение
То есть зависит от того, что решит компилятор делать с этим чудом?
Компилятор только компилирует, т.е. создает программу. Программа запускается без компилятора.
easybudda
Модератор
Эксперт С++
 Аватар для easybudda
9373 / 5423 / 914
Регистрация: 25.07.2009
Сообщений: 10,423
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
Модератор
Эксперт С++
 Аватар для easybudda
9373 / 5423 / 914
Регистрация: 25.07.2009
Сообщений: 10,423
09.01.2012, 06:18     Нулевой указатель #7
Цитата Сообщение от Tamoren Посмотреть сообщение
Запускать не решился
Не, ну комп взорваться не должен...

Цитата Сообщение от Tamoren Посмотреть сообщение
а неопределенность, как я понимаю, означает, что на разных платформах может быть по разному
Можно и так сказать. Несколько удивило поведение в dosbox
Нулевой указатель
easybudda
Модератор
Эксперт С++
 Аватар для easybudda
9373 / 5423 / 914
Регистрация: 25.07.2009
Сообщений: 10,423
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
Ушёл с форума.
 Аватар для 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++
3582 / 1362 / 128
Регистрация: 16.04.2009
Сообщений: 4,528
09.01.2012, 11:06     Нулевой указатель #11
Цитата Сообщение от Tamoren Посмотреть сообщение
Что происхот при:
В стандарте этот момент не оговорен. Это Undefined behavior. Разыменование нулевых указателей, которые равны NULL, может дать 0, или любое произвольное значение, или остановку программы, или сигнал какого-либо вида, или исключение. Или все вместе. Или что-то еще.

Добавлено через 50 минут
Цитата Сообщение от Tamoren Посмотреть сообщение
Эээ это у него указатель на 0 равен нулю?
И такое возможно
Evg
Эксперт С++Автор FAQ
 Аватар для Evg
16843 / 5264 / 323
Регистрация: 30.03.2009
Сообщений: 14,159
Записей в блоге: 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     Нулевой указатель
Еще ссылки по теме:

Функция, получающая указатель на обычную функцию, получает указатель на метод класса C++
C++ Как работает нулевой указатель null
C++ Как правильно удалять выделенную память под указатель на указатель?

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

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

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

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