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

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

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

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

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

Что происхот при:
C++
1
2
    int* p = NULL;
    cout << *p;
Другими словами, на что ссылается нулевой указатель? Компилятор ошибок не выдает.
0
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
09.01.2012, 05:26
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Нулевой указатель (C++):

Нулевой указатель - C++
Всем привет. Возникли вот такие вопросы: Допустим, есть код: char *a = new char(5); В каких пределах будет находиться a? Т.е....

Нулевой указатель на функцию - C++
Всем привет. Ещё раз подыму предыдущую тему. Я делаю упражнение на явное связывание dll. Проблема состоит вот в чем. Я кладу библиотеку в...

Нулевой указатель на объект - C++
Здравствуйте. #include &lt;iostream&gt; using std::cout; using std::endl; class A { public: A() {} int Foo() { return 56;...

Как работает нулевой указатель? - C++
Как загнать нулевой указатель на Пробовал вот так, например: {... char *REZ=STR(str2, str1); *REZ!=NULL ? printf(&quot;\n%c&quot;, *REZ) :...

Как проверить нулевой ли указатель? - C++
Как проверить нулевой ли указатель? Почему-то всегда думал что так: if (pointer) Но не работает Заранее спасибо!

Как работает нулевой указатель null - C++
int x = NULL; указывает на то, что память на переменную x выделилась, но она ни на что не указывает(не имеет значения)?

Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
DU
1483 / 1059 / 45
Регистрация: 05.12.2011
Сообщений: 2,279
09.01.2012, 05:28 #2
ни на что не ссылается. поведение при разыменовывании нулевого указателя неопределено. в рантайме скорее всего покрашится все.
1
Tamoren
0 / 0 / 0
Регистрация: 08.01.2012
Сообщений: 37
09.01.2012, 05:50  [ТС] #3
То есть зависит от того, что решит компилятор делать с этим чудом?
0
Chelioss
180 / 180 / 4
Регистрация: 08.01.2011
Сообщений: 1,133
09.01.2012, 05:55 #4
Цитата Сообщение от Tamoren Посмотреть сообщение
То есть зависит от того, что решит компилятор делать с этим чудом?
Компилятор только компилирует, т.е. создает программу. Программа запускается без компилятора.
0
easybudda
Модератор
Эксперт CЭксперт С++
9632 / 5580 / 948
Регистрация: 25.07.2009
Сообщений: 10,714
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 $
2
Tamoren
0 / 0 / 0
Регистрация: 08.01.2012
Сообщений: 37
09.01.2012, 06:05  [ТС] #6
Цитата Сообщение от easybudda Посмотреть сообщение
Опять же - а дописать, скомпилировать
Дописал, скомпилировал - без предупреждений и ошибок. Запускать не решился Я же не знаю произойдет после запуска.
А почему же все-таки этот код компилируется?

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

Цитата Сообщение от Tamoren Посмотреть сообщение
а неопределенность, как я понимаю, означает, что на разных платформах может быть по разному
Можно и так сказать. Несколько удивило поведение в dosbox
Нулевой указатель
1
easybudda
Модератор
Эксперт CЭксперт С++
9632 / 5580 / 948
Регистрация: 25.07.2009
Сообщений: 10,714
09.01.2012, 06:25 #8
Цитата Сообщение от easybudda Посмотреть сообщение
Несколько удивило поведение в dosbox
Чем дальше в лес, тем толще партизаны
Нулевой указатель
0
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?!
0
taras atavin
Ушёл с форума.
3569 / 1753 / 91
Регистрация: 24.11.2009
Сообщений: 27,619
09.01.2012, 08:19 #10
Цитата Сообщение от Tamoren Посмотреть сообщение
Другими словами, на что ссылается нулевой указатель? Компилятор ошибок не выдает.
Комилятор не среагирует при любом значении, так как вообще не его дело заниматься значениями. Строка
C++
1
cout<<*p;
компилится отдельно ото всего остального, кроме декларации одного лишь типа величины p, то есть кроме
C++
1
int* p;
, игнорируя инициализацию, а будучи вырванной из контекста, ошибок не содержит. Ошибка может быть только в рантайме, так что запусти и любуйся красивым глюком.
1
go
Эксперт C++
3586 / 1366 / 128
Регистрация: 16.04.2009
Сообщений: 4,528
09.01.2012, 11:06 #11
Цитата Сообщение от Tamoren Посмотреть сообщение
Что происхот при:
В стандарте этот момент не оговорен. Это Undefined behavior. Разыменование нулевых указателей, которые равны NULL, может дать 0, или любое произвольное значение, или остановку программы, или сигнал какого-либо вида, или исключение. Или все вместе. Или что-то еще.

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

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

Добавлено через 55 секунд
Правда второй пример это не объясняет... Разве что эта область памяти защищена для записи (т.е. читать можно, а писать - нет)
1
Tamoren
0 / 0 / 0
Регистрация: 08.01.2012
Сообщений: 37
09.01.2012, 16:10  [ТС] #13
Да, спасибо. Это я уже примерно понял.

Только врубиться не могу, как такое в DOSBox'е получилось?
0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
09.01.2012, 16:10
Привет! Вот еще темы с ответами:

Заставить указатель указывать на нулевой элемент массива - C++
Вроде бы и простой вопрос для начинающих, но почему-то не могу найти на него ответ. Есть функция сортировки массива, алгоритм типа...

Функция fopen возвращает нулевой указатель (Visual Studio) - C++
Здраствуйте) У меня возникла очень странная проблема.просто мистика. С чем может быть связано возвращение нулевого указателя в...

Как получить ссылку на указатель или указатель на указатель в массиве? - C++
В процессе реализации сортировки пузырьком натолкнулся на такую проблему: как поменять значения указателей, передаваемых в функцию. Если...

Функция, получающая указатель на обычную функцию, получает указатель на метод класса - C++
Здравтсвуйте. Имеется вопрос по указателям на методы класса. Допустим, есть функция( f ), которая принимает указатель на функцию и...


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

Или воспользуйтесь поиском по форуму:
Yandex
Объявления
09.01.2012, 16:10
Ответ Создать тему
Опции темы

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