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

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

Войти
Регистрация
Восстановить пароль
 
Dani
1265 / 623 / 51
Регистрация: 11.08.2011
Сообщений: 2,245
Записей в блоге: 2
Завершенные тесты: 1
#1

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

23.12.2013, 19:18. Просмотров 530. Ответов 7
Метки нет (Все метки)

Всем привет. Возникли вот такие вопросы:
Допустим, есть код:
C++
1
char *a = new char(5);
В каких пределах будет находиться a? Т.е. максимальное значение а, по идее, - размер оперативной памяти, а минимальное? 0 может быть?
И нулевой указатель. Это вообще что такое? char *a = 0 идет, а char *a = 1 (не дадут ведь произвольную область памяти занять).
Делают проверки на неравенство указателя нулю. А если нам new выдаст указатель на 0 и мы своей проверкой на неравенство определим, что указатель плохой, то получится ошибка. Может так получиться?
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
23.12.2013, 19:18     Нулевой указатель
Посмотрите здесь:

Функция fopen возвращает нулевой указатель (Visual Studio) C++
C++ Как проверить нулевой ли указатель?
C++ Нулевой указатель
C++ Нулевой указатель на функцию
Приведение любого двумерного массива к типу указатель на указатель C++
Реализация двоичных деревьев поиска: Зачем в параметрах функции используется указатель на указатель C++
C++ Как работает нулевой указатель null
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
taras atavin
Ушёл с форума.
3569 / 1752 / 91
Регистрация: 24.11.2009
Сообщений: 27,619
23.12.2013, 19:27     Нулевой указатель #2
Цитата Сообщение от Dani Посмотреть сообщение
Т.е. максимальное значение а, по идее, - размер оперативной памяти,
Нет. Адреса виртуальны и страница может быть отображена на такие адреса, до которых непрерывно от ноля не хватает памяти.
Цитата Сообщение от Dani Посмотреть сообщение
А если нам new выдаст указатель на 0 и мы своей проверкой на неравенство определим, что указатель плохой, то получится ошибка.
Ни какой ошибки, нулевого адреса нет, это специальное значение указателя в никуда, ему не соответствует ни какой байт в памяти. Так что new может вернуть 0 в единственном случае - если память не удалось выделить. Хотя, бывают платформы, где нулевой адрес валиден, но тогда проверяют на равенство не нолю, а, наоборот, очень большому значению, равного которому адреса опять таки нет.
IGPIGP
Комп_Оратор)
Эксперт по математике/физике
6411 / 3050 / 300
Регистрация: 04.12.2011
Сообщений: 8,236
Записей в блоге: 3
23.12.2013, 19:40     Нулевой указатель #3
Dani, нулю или специальному значению вроде nullptr (это лучше), если оно поддерживается можно присвоить при объявлении:
C++
1
2
char *a = 0;
//char *a = nullptr;
потом, чтобы не получить исключения:
C++
1
2
3
4
5
6
7
a = new std::nothrow char[256];
if(!a){
//if(a != nullptr){
//используем выделенную память
}else{
//обрабатываем ситуацию
}
gazlan
3130 / 1905 / 285
Регистрация: 27.08.2010
Сообщений: 5,132
Записей в блоге: 1
23.12.2013, 19:41     Нулевой указатель #4
Цитата Сообщение от Dani Посмотреть сообщение
char* a = new char(5);
Выделяет один байт памяти в куче и инициализирует его значением 5.

C++
1
char*    a = new char[0];
Создает указатель на символьный массив нулевого размера.
Dani
1265 / 623 / 51
Регистрация: 11.08.2011
Сообщений: 2,245
Записей в блоге: 2
Завершенные тесты: 1
23.12.2013, 19:49  [ТС]     Нулевой указатель #5
Цитата Сообщение от taras atavin Посмотреть сообщение
до которых непрерывно от ноля не хватает памяти
Может быть до которых хватает...
А можешь перефразировать вот это или объяснить "на пальцах"?

Добавлено через 1 минуту
gazlan, я написал, как задумывалось. Я не хотел массив из 5 эл-тов выделить, как можно было бы подумать.
taras atavin
Ушёл с форума.
3569 / 1752 / 91
Регистрация: 24.11.2009
Сообщений: 27,619
23.12.2013, 19:56     Нулевой указатель #6
Цитата Сообщение от Dani Посмотреть сообщение
Может быть до которых хватает...
И такой адрес тоже валиден. Но валиден и такой, до которого не хватает. В локальном адресном пространстве просто будет "дыра".
Dani
1265 / 623 / 51
Регистрация: 11.08.2011
Сообщений: 2,245
Записей в блоге: 2
Завершенные тесты: 1
23.12.2013, 20:14  [ТС]     Нулевой указатель #7
taras atavin, Т.е. если нужно выделить, допустим, 100 байт памяти, то страница будет ссылаться на ту, ближайшую от нуля, область, от которой можно выделить 100 байт. Так?
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
24.12.2013, 07:48     Нулевой указатель
Еще ссылки по теме:

Как работает нулевой указатель? C++
Объяснить работу функции, возвращающей указатель на указатель на char C++
Заставить указатель указывать на нулевой элемент массива C++
C++ Указатель на указатель, функции для создания новых массивов?
C++ Нулевой указатель на объект

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

Или воспользуйтесь поиском по форуму:
taras atavin
Ушёл с форума.
3569 / 1752 / 91
Регистрация: 24.11.2009
Сообщений: 27,619
24.12.2013, 07:48     Нулевой указатель #8
Цитата Сообщение от Dani Посмотреть сообщение
taras atavin, Т.е. если нужно выделить, допустим, 100 байт памяти, то страница будет ссылаться на ту, ближайшую от нуля, область, от которой можно выделить 100 байт. Так?
Нет не так. Память будет выделена в диапазоне адресов, выбранном на усмотрение системы из числа тех, в которых есть не менее, чем по 100 свободных байт. Из какой именно страницы это произойдёт, не известно даже самому Биллу, она может вообще ни куда не прижиматься. Это может быть страница, ранее уже использованная для выделения памяти тому же приложению, но использованная не полностью. У меня почему-то большинство адресов прижимается снизу к 1 073 741 824, не зависимо от того, стоит ли на машине 4 гигабайта, или же 256 мегабайт.
Yandex
Объявления
24.12.2013, 07:48     Нулевой указатель
Ответ Создать тему
Опции темы

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