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

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

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

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

23.12.2013, 19:18. Просмотров 576. Ответов 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
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Нулевой указатель (C++):

Нулевой указатель - C++
Что происхот при: int* p = NULL; cout << *p; Другими словами, на что ссылается нулевой указатель? Компилятор ошибок не...

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

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

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

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

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

7
taras atavin
3569 / 1752 / 91
Регистрация: 24.11.2009
Сообщений: 27,619
23.12.2013, 19:27 #2
Цитата Сообщение от Dani Посмотреть сообщение
Т.е. максимальное значение а, по идее, - размер оперативной памяти,
Нет. Адреса виртуальны и страница может быть отображена на такие адреса, до которых непрерывно от ноля не хватает памяти.
Цитата Сообщение от Dani Посмотреть сообщение
А если нам new выдаст указатель на 0 и мы своей проверкой на неравенство определим, что указатель плохой, то получится ошибка.
Ни какой ошибки, нулевого адреса нет, это специальное значение указателя в никуда, ему не соответствует ни какой байт в памяти. Так что new может вернуть 0 в единственном случае - если память не удалось выделить. Хотя, бывают платформы, где нулевой адрес валиден, но тогда проверяют на равенство не нолю, а, наоборот, очень большому значению, равного которому адреса опять таки нет.
1
IGPIGP
Комп_Оратор)
Эксперт по математике/физике
6503 / 3139 / 307
Регистрация: 04.12.2011
Сообщений: 8,661
Записей в блоге: 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
3133 / 1909 / 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];
Создает указатель на символьный массив нулевого размера.
0
Dani
1393 / 637 / 57
Регистрация: 11.08.2011
Сообщений: 2,282
Записей в блоге: 2
Завершенные тесты: 1
23.12.2013, 19:49  [ТС] #5
Цитата Сообщение от taras atavin Посмотреть сообщение
до которых непрерывно от ноля не хватает памяти
Может быть до которых хватает...
А можешь перефразировать вот это или объяснить "на пальцах"?

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

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

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

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

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


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

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

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