Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.78/64: Рейтинг темы: голосов - 64, средняя оценка - 4.78
0 / 0 / 0
Регистрация: 22.06.2010
Сообщений: 25

Как узнать, инициализирован ли указатель?

29.06.2011, 18:54. Показов 12944. Ответов 16
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Появился вопрос, как узнать в C++ инициализирован ли определенный указатель?
0
Лучшие ответы (1)
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
29.06.2011, 18:54
Ответы с готовыми решениями:

Как узнать инициализирован ли массив?
Постоянно забываю, как это правильно делать. Здесь прочитал такой способ: Option Explicit 'SAFEARRAY** (указатель на...

Как узнать указатель файла
VS 2010 С++ Выбираю файл через openFileDialog1. Как узнать хэндл файла openFileDialog1->FileName. Сразу сообщаю, что fileHandle...

QTableWidget как узнать указатель?
Доброго времени суток! Имеется QTableWidget в одном столбце установлены виджеты- QComboBox,т.е. он есть в каждой строке. Задача узнать...

16
Эксперт С++
 Аватар для nameless
342 / 306 / 36
Регистрация: 16.06.2009
Сообщений: 486
29.06.2011, 19:02
ledkets,

C
1
2
3
4
5
6
7
8
9
10
11
12
13
#include <stdio.h>
 
int main()
{
   int* ptr;
   
   if (!ptr)
      printf("Not");
   else
      printf("Yes");
 
   return 0;
}
В данном случае выведется "Yes", т.к. переменная указывает на неизвестную область памяти

C
1
2
3
4
5
6
7
8
9
10
11
int main()
{
   int* ptr = NULL;
   
   if (!ptr)
      printf("Not");
   else
      printf("Yes");
 
   return 0;
}
Выведется "Not";

В данном случае выведется "Yes", т.к. переменная указывает на неизвестную область памяти

C
1
2
3
4
5
6
7
8
9
10
11
12
int main()
{
   int a = 1;
   int* ptr = &a;
   
   if (!ptr)
      printf("Not");
   else
      printf("Yes");
 
   return 0;
}
Выведет "Yes", так как ptr хранит адрес переменной a;
2
 Аватар для oxotnik
1665 / 1134 / 80
Регистрация: 21.08.2008
Сообщений: 4,734
Записей в блоге: 1
29.06.2011, 21:43
Цитата Сообщение от ledkets Посмотреть сообщение
Появился вопрос, как узнать в C++ инициализирован ли определенный указатель?
в общем случае никак
0
237 / 210 / 29
Регистрация: 08.06.2011
Сообщений: 467
29.06.2011, 22:23
Мне вобще непонятно, как можно считать NULL указатель не инициализированным, таковым можно считать указатель который был обьявлен и ему не было присвоено никакое значение, а когда вы пишете
C++
1
 int* ptr = NULL;
то вы инициализируете указатель значением NULL и он уже содержит в себе не мусор, а определенное значение которое гарантированно не является валидным адресом обьекта в памяти.
0
Заблокирован
29.06.2011, 22:26
Цитата Сообщение от Net_Wanderer Посмотреть сообщение
Мне вобще непонятно, как можно считать NULL указатель не инициализированным, таковым можно считать указатель который был обьявлен и ему не было присвоено никакое значение, а когда вы пишете
C++
1
 int* ptr = NULL;
то вы инициализируете указатель значением NULL и он уже содержит в себе не мусор, а определенное значение которое гарантированно не является валидным адресом обьекта в памяти.
Инициализация указателя - это присваивание ему явного значения.
Что бы проверить, что указатель содержит не мусор (явное значение), нужно либо проверить содержимое указателя в режиме "чтение-только" на предмет какого нить симафора (первый байт должен содержать то-то и то-то. Хотя сие не есть панацея), либо на равенство к нулю (указатель инициализирован, но выключен)
0
Evg
Эксперт CАвтор FAQ
 Аватар для Evg
21281 / 8305 / 637
Регистрация: 30.03.2009
Сообщений: 22,660
Записей в блоге: 30
29.06.2011, 23:28
Цитата Сообщение от ledkets Посмотреть сообщение
Появился вопрос, как узнать в C++ инициализирован ли определенный указатель?
Вопрос в том, что считать "инициализированным указателем". В примере из поста #2 указатель инициализирован мусором, а потому этот код в каких-то случаях будет писать Yes (если мусор оказался отличным от NULL), а в каких-то No (если мусор оказался равен NULL).

Далее шли бодяги на предмет сравнения с NULL'ом как эквивалент валидности. Это тоже неверно

C
1
2
p = malloc (10);
free (p);
после такого кода p инициализирован (т.е. содержит вполне конкретное значение), отличен от NULL, но в то же время невалиден, потому как эта память уже освобождена.

Ответ на вопрос поставленный вопрос - "нет". Как только в Си появились указатели, сразу же появилось огромное море проблем, связанных с ними. И с тех пор человечество пытается что-то сделать, но универсальных способов контроля за кривыми указателями до сих пор не придумали.
2
1 / 1 / 1
Регистрация: 04.10.2012
Сообщений: 45
26.11.2012, 21:49
Действительно никак что ли? Просто если не для себя пишешь и надо узнать выделялась ли для указателя память, чтобы знать нужно ли ее высвободить в функции перед тем, как заново выделить
0
 Аватар для ps10n1ck
56 / 50 / 11
Регистрация: 10.11.2010
Сообщений: 132
26.11.2012, 21:55
Цитата Сообщение от NEW_NAME Посмотреть сообщение
Действительно никак что ли? Просто если не для себя пишешь и надо узнать выделялась ли для указателя память, чтобы знать нужно ли ее высвободить в функции перед тем, как заново выделить
для этого указатель в самом начале инициализируют 0 (NULL), а потом проверяют на равенство 0
0
 Аватар для v.a.l.i.d
425 / 390 / 113
Регистрация: 21.09.2012
Сообщений: 913
26.11.2012, 22:04
Цитата Сообщение от ps10n1ck Посмотреть сообщение
для этого указатель в самом начале инициализируют 0 (NULL), а потом проверяют на равенство 0
C++
1
2
3
4
5
6
    int *ptr = new int;
 
    delete ptr;
 
    if (ptr) cout << "Указатель инициализирован" << endl;
    else cout << "Указатель неинициализирован" << endl;
почему то печатает что "указатель инициализирован"! непонятно почему так получается
0
~ Эврика! ~
 Аватар для OhMyGodSoLong
1258 / 1007 / 74
Регистрация: 24.07.2012
Сообщений: 2,002
26.11.2012, 22:07
Смарт-поинтеры решат если не все, то по крайней мере большинство проблем, связанных с неинициализированностью, обращению к нуллам и обращению к убитым объектам.

> почему то печатает что "указатель инициализирован"! непонятно
Потому что delete не изменяет значение указателя, он только вызывает деструктор и освобождает выделенную память.
1
 Аватар для ps10n1ck
56 / 50 / 11
Регистрация: 10.11.2010
Сообщений: 132
26.11.2012, 22:10
Цитата Сообщение от V.A.L.I.D Посмотреть сообщение
C++
1
2
3
4
5
6
    int *ptr = new int;
 
    delete ptr;
 
    if (ptr) cout << "Указатель инициализирован" << endl;
    else cout << "Указатель неинициализирован" << endl;
почему то печатает что "указатель инициализирован"! непонятно почему так получается
для таких целей можно сделать макрос
#define SAFE_DELETE(data) {delete data; data = 0;}

тогда вместо
C++
1
delete ptr;
пишем
C++
1
SAFE_DELETE(ptr);
1
Evg
Эксперт CАвтор FAQ
 Аватар для Evg
21281 / 8305 / 637
Регистрация: 30.03.2009
Сообщений: 22,660
Записей в блоге: 30
26.11.2012, 23:00
Цитата Сообщение от ~OhMyGodSoLong~ Посмотреть сообщение
Смарт-поинтеры решат если не все, то по крайней мере большинство проблем
На самом деле большинство проблем решают наличие головы и опыта работы, потому что начинаешь понимать, где лежат грабли и куда стелить солому. А если голова дурная, то уже мало что спасёт
0
26.11.2012, 23:17

Не по теме:

А потом становится влом убирать за собой солому, когда знакомишься с чертовски пунктуальной горничной.

0
Эксперт С++
5058 / 3118 / 271
Регистрация: 11.11.2009
Сообщений: 7,044
26.11.2012, 23:40
Evg, думаю, смартпоинтеры будут понадёжнее самой НЕдурной головы всё же.
0
Evg
Эксперт CАвтор FAQ
 Аватар для Evg
21281 / 8305 / 637
Регистрация: 30.03.2009
Сообщений: 22,660
Записей в блоге: 30
27.11.2012, 00:15
Лучший ответ Сообщение было отмечено как решение

Решение

Цитата Сообщение от ~OhMyGodSoLong~ Посмотреть сообщение

Не по теме:

А потом становится влом убирать за собой солому, когда знакомишься с чертовски пунктуальной горничной.

Цитата Сообщение от silent_1991 Посмотреть сообщение
Evg, думаю, смартпоинтеры будут понадёжнее самой НЕдурной головы всё же.
Хоть обычный указатель, хоть умный, принципиальной разницы нет. Как и любая другая технология - это мощное средство в умелых руках, и способ нажить геморрой для тех, кто не умеет правильно работать с техникой, потому что толком не понимает, как она устроена и для чего придумана.

Вот лично моё мнение, что работать с умными указателями для начинающих - это не правильно. Начинающему крайне важно получить граблями по лбу, чтобы научиться самому стелить солому, там, где надо. А горничных надо звать только тогда, когда сам научился стелить, и процесс застилания соломы превращается в рутину и потерю времени. А когда с детства приучаешься к тому, что солому стелит горничная, то в итоге вырастают программисты-индусы. Это всего лишь моё мнение, которое основано на многолетнем собственном опыте и опыте работы в команде, в которой есть любители горничных (к сожалению, в реальной жизни от таких никуда не денешься). Я ни в коем случае не отрицаю, что нужно использовать результаты научно-технического прогресса. Но хороший специалист просто обязан знать фундаментальные вещи и понимать, откуда растут фундаментальные проблемы
3
Эксперт С++
5058 / 3118 / 271
Регистрация: 11.11.2009
Сообщений: 7,044
27.11.2012, 00:17
Evg, со всем сказанным согласен. Мой комментарий относился к случаю, когда шишки уже набиты, и надо код писать, а не велосипеды изобретать.
0
Evg
Эксперт CАвтор FAQ
 Аватар для Evg
21281 / 8305 / 637
Регистрация: 30.03.2009
Сообщений: 22,660
Записей в блоге: 30
27.11.2012, 08:58
Цитата Сообщение от silent_1991 Посмотреть сообщение
Мой комментарий относился к случаю, когда шишки уже набиты, и надо код писать, а не велосипеды изобретать.
Это-то понятно. Просто форум - он всё-таки в первую очередь для начинающих и я высказался именно под этим углом.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
27.11.2012, 08:58
Помогаю со студенческими работами здесь

Как узнать тип, переданный через указатель на void?
есть функция, принимает LPVOID, нужно узнать как тип переменной был передан, и сколько занимает в байтах, подскажите как это сделать

Как узнать указатель класса, который передается в библиотеку на C
Я в своем приложении использую внешнюю DLL написанную на С. При вызове функций использую атрибут DllImport. Для отладки хочу сравнить...

Как узнать, что заданная переменная - это указатель?
Здравствуйте, подскажите пожалуйста - Как узнать что, какая то, переменная это указатель? Например: int *p = new int; Как...

Как узнать, где кончается массив, если есть указатель на него?
Есть указатель на массив. Необходимо проделать некоторую операцию со всеми элементами массива. Как узнать, где последний элемент, имея...

Как можно узнать размер выделенной динамической памяти, на которую ссылается указатель a?
Скажем я в какой-то момент выделяю память под массив: int *a = new int ; затем память может изменяться как-то и конечный размер мне не...


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

Или воспользуйтесь поиском по форуму:
17
Ответ Создать тему
Новые блоги и статьи
модель ЗдравоСохранения 8. Подготовка к разному выполнению заданий
anaschu 08.04.2026
https:/ / github. com/ shumilovas/ med2. git main ветка * содержимое блока дэлэй из старой модели теперь внутри зайца новой модели 8ATzM_2aurI
Блокировка документа от изменений, если он открыт у другого пользователя
Maks 08.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа, разработанного в конфигурации КА2. Задача: запретить редактирование документа, если он открыт у другого пользователя. / / . . .
Система безопасности+живучести для сервера-слоя интернета (сети). Двойная привязка.
Hrethgir 08.04.2026
Далее были размышления о системе безопасности. Сообщения с наклонным текстом - мои. А как нам будет можно проверить, что ссылка наша, а не подделана хулиганами, которая выбросит на другую ветку и. . .
Модель ЗдрввоСохранения 7: больше работников, больше ресурсов.
anaschu 08.04.2026
работников и заданий может быть сколько угодно, но настроено всё так, что используется пока что только 20% kYBz3eJf3jQ
Дальние перспективы сервера - слоя сети с космологическим дизайном интефейса карты и логики.
Hrethgir 07.04.2026
Дальнейшее ближайшее планирование вывело к размышлениям над дальними перспективами. И вот тут может быть даже будут нужны оценки специалистов, так как в дальних перспективах всё может очень сильно. . .
Горе от ума
kumehtar 07.04.2026
Эта мне ментальная установка, что вот прямо сейчас, мол, мне для полного счастья не хватает (нужное вписать), и когда я этого достигну - тогда и полный кайф. Одна из самых сильных ловушек на пути. . . .
Использование значений реквизитов справочника в документе, с определенными условиями и правами
Maks 07.04.2026
1. Контроль срока действия договора Алгоритм из решения ниже реализован на примере нетипового документа "ЗаявкаНаРаботу", разработанного в конфигурации КА2. Задача: уведомлять пользователя, если. . .
Доступность команды формы по условию
Maks 07.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "СписаниеМатериалов", разработанного в конфигурации КА2. Задача: сделать доступной кнопку (команда формы "ЗавершитьСписание") при. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru