Форум программистов, компьютерный форум, киберфорум
Наши страницы
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.75/4: Рейтинг темы: голосов - 4, средняя оценка - 4.75
Dani
1393 / 637 / 134
Регистрация: 11.08.2011
Сообщений: 2,299
Записей в блоге: 2
Завершенные тесты: 1
#1

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

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

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

Нулевой указатель
Что происхот при: int* p = NULL; cout << *p; Другими словами, на что...

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

Нулевой указатель на объект
Здравствуйте. #include <iostream> using std::cout; using std::endl; ...

Как проверить нулевой ли указатель?
Как проверить нулевой ли указатель? Почему-то всегда думал что так: if...

Как работает нулевой указатель?
Как загнать нулевой указатель на Пробовал вот так, например: {... char...

7
taras atavin
4204 / 1765 / 211
Регистрация: 24.11.2009
Сообщений: 27,565
23.12.2013, 19:27 #2
Цитата Сообщение от Dani Посмотреть сообщение
Т.е. максимальное значение а, по идее, - размер оперативной памяти,
Нет. Адреса виртуальны и страница может быть отображена на такие адреса, до которых непрерывно от ноля не хватает памяти.
Цитата Сообщение от Dani Посмотреть сообщение
А если нам new выдаст указатель на 0 и мы своей проверкой на неравенство определим, что указатель плохой, то получится ошибка.
Ни какой ошибки, нулевого адреса нет, это специальное значение указателя в никуда, ему не соответствует ни какой байт в памяти. Так что new может вернуть 0 в единственном случае - если память не удалось выделить. Хотя, бывают платформы, где нулевой адрес валиден, но тогда проверяют на равенство не нолю, а, наоборот, очень большому значению, равного которому адреса опять таки нет.
1
IGPIGP
Комп_Оратор)
Эксперт по математике/физике
7045 / 3346 / 452
Регистрация: 04.12.2011
Сообщений: 9,306
Записей в блоге: 5
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{
//обрабатываем ситуацию
}
1
gazlan
3139 / 1915 / 311
Регистрация: 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];
Создает указатель на символьный массив нулевого размера.
0
Dani
1393 / 637 / 134
Регистрация: 11.08.2011
Сообщений: 2,299
Записей в блоге: 2
Завершенные тесты: 1
23.12.2013, 19:49  [ТС] #5
Цитата Сообщение от taras atavin Посмотреть сообщение
до которых непрерывно от ноля не хватает памяти
Может быть до которых хватает...
А можешь перефразировать вот это или объяснить "на пальцах"?

Добавлено через 1 минуту
gazlan, я написал, как задумывалось. Я не хотел массив из 5 эл-тов выделить, как можно было бы подумать.
0
taras atavin
4204 / 1765 / 211
Регистрация: 24.11.2009
Сообщений: 27,565
23.12.2013, 19:56 #6
Цитата Сообщение от Dani Посмотреть сообщение
Может быть до которых хватает...
И такой адрес тоже валиден. Но валиден и такой, до которого не хватает. В локальном адресном пространстве просто будет "дыра".
0
Dani
1393 / 637 / 134
Регистрация: 11.08.2011
Сообщений: 2,299
Записей в блоге: 2
Завершенные тесты: 1
23.12.2013, 20:14  [ТС] #7
taras atavin, Т.е. если нужно выделить, допустим, 100 байт памяти, то страница будет ссылаться на ту, ближайшую от нуля, область, от которой можно выделить 100 байт. Так?
0
taras atavin
4204 / 1765 / 211
Регистрация: 24.11.2009
Сообщений: 27,565
24.12.2013, 07:48 #8
Цитата Сообщение от Dani Посмотреть сообщение
taras atavin, Т.е. если нужно выделить, допустим, 100 байт памяти, то страница будет ссылаться на ту, ближайшую от нуля, область, от которой можно выделить 100 байт. Так?
Нет не так. Память будет выделена в диапазоне адресов, выбранном на усмотрение системы из числа тех, в которых есть не менее, чем по 100 свободных байт. Из какой именно страницы это произойдёт, не известно даже самому Биллу, она может вообще ни куда не прижиматься. Это может быть страница, ранее уже использованная для выделения памяти тому же приложению, но использованная не полностью. У меня почему-то большинство адресов прижимается снизу к 1 073 741 824, не зависимо от того, стоит ли на машине 4 гигабайта, или же 256 мегабайт.
1
24.12.2013, 07:48
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
24.12.2013, 07:48

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

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

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


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

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

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