0 / 0 / 0
Регистрация: 22.06.2010
Сообщений: 25
1

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

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

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

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

Как узнать указатель файла
VS 2010 С++ Выбираю файл через openFileDialog1. Как узнать хэндл файла...

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

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

16
Эксперт С++
342 / 306 / 36
Регистрация: 16.06.2009
Сообщений: 486
29.06.2011, 19:02 2
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
1665 / 1134 / 80
Регистрация: 21.08.2008
Сообщений: 4,734
Записей в блоге: 1
29.06.2011, 21:43 3
Цитата Сообщение от ledkets Посмотреть сообщение
Появился вопрос, как узнать в C++ инициализирован ли определенный указатель?
в общем случае никак
0
237 / 210 / 29
Регистрация: 08.06.2011
Сообщений: 467
29.06.2011, 22:23 4
Мне вобще непонятно, как можно считать NULL указатель не инициализированным, таковым можно считать указатель который был обьявлен и ему не было присвоено никакое значение, а когда вы пишете
C++
1
 int* ptr = NULL;
то вы инициализируете указатель значением NULL и он уже содержит в себе не мусор, а определенное значение которое гарантированно не является валидным адресом обьекта в памяти.
0
Заблокирован
29.06.2011, 22:26 5
Цитата Сообщение от Net_Wanderer Посмотреть сообщение
Мне вобще непонятно, как можно считать NULL указатель не инициализированным, таковым можно считать указатель который был обьявлен и ему не было присвоено никакое значение, а когда вы пишете
C++
1
 int* ptr = NULL;
то вы инициализируете указатель значением NULL и он уже содержит в себе не мусор, а определенное значение которое гарантированно не является валидным адресом обьекта в памяти.
Инициализация указателя - это присваивание ему явного значения.
Что бы проверить, что указатель содержит не мусор (явное значение), нужно либо проверить содержимое указателя в режиме "чтение-только" на предмет какого нить симафора (первый байт должен содержать то-то и то-то. Хотя сие не есть панацея), либо на равенство к нулю (указатель инициализирован, но выключен)
0
Evg
Эксперт CАвтор FAQ
21279 / 8301 / 637
Регистрация: 30.03.2009
Сообщений: 22,659
Записей в блоге: 30
29.06.2011, 23:28 6
Цитата Сообщение от 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 7
Действительно никак что ли? Просто если не для себя пишешь и надо узнать выделялась ли для указателя память, чтобы знать нужно ли ее высвободить в функции перед тем, как заново выделить
0
56 / 50 / 11
Регистрация: 10.11.2010
Сообщений: 132
26.11.2012, 21:55 8
Цитата Сообщение от NEW_NAME Посмотреть сообщение
Действительно никак что ли? Просто если не для себя пишешь и надо узнать выделялась ли для указателя память, чтобы знать нужно ли ее высвободить в функции перед тем, как заново выделить
для этого указатель в самом начале инициализируют 0 (NULL), а потом проверяют на равенство 0
0
425 / 390 / 113
Регистрация: 21.09.2012
Сообщений: 913
26.11.2012, 22:04 9
Цитата Сообщение от 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
~ Эврика! ~
1256 / 1005 / 74
Регистрация: 24.07.2012
Сообщений: 2,002
26.11.2012, 22:07 10
Смарт-поинтеры решат если не все, то по крайней мере большинство проблем, связанных с неинициализированностью, обращению к нуллам и обращению к убитым объектам.

> почему то печатает что "указатель инициализирован"! непонятно
Потому что delete не изменяет значение указателя, он только вызывает деструктор и освобождает выделенную память.
1
56 / 50 / 11
Регистрация: 10.11.2010
Сообщений: 132
26.11.2012, 22:10 11
Цитата Сообщение от 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
21279 / 8301 / 637
Регистрация: 30.03.2009
Сообщений: 22,659
Записей в блоге: 30
26.11.2012, 23:00 12
Цитата Сообщение от ~OhMyGodSoLong~ Посмотреть сообщение
Смарт-поинтеры решат если не все, то по крайней мере большинство проблем
На самом деле большинство проблем решают наличие головы и опыта работы, потому что начинаешь понимать, где лежат грабли и куда стелить солому. А если голова дурная, то уже мало что спасёт
0
OhMyGodSoLong
26.11.2012, 23:17
  #13

Не по теме:

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

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

Решение

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

Не по теме:

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

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

Вот лично моё мнение, что работать с умными указателями для начинающих - это не правильно. Начинающему крайне важно получить граблями по лбу, чтобы научиться самому стелить солому, там, где надо. А горничных надо звать только тогда, когда сам научился стелить, и процесс застилания соломы превращается в рутину и потерю времени. А когда с детства приучаешься к тому, что солому стелит горничная, то в итоге вырастают программисты-индусы. Это всего лишь моё мнение, которое основано на многолетнем собственном опыте и опыте работы в команде, в которой есть любители горничных (к сожалению, в реальной жизни от таких никуда не денешься). Я ни в коем случае не отрицаю, что нужно использовать результаты научно-технического прогресса. Но хороший специалист просто обязан знать фундаментальные вещи и понимать, откуда растут фундаментальные проблемы
3
Эксперт С++
5055 / 3115 / 271
Регистрация: 11.11.2009
Сообщений: 7,044
27.11.2012, 00:17 16
Evg, со всем сказанным согласен. Мой комментарий относился к случаю, когда шишки уже набиты, и надо код писать, а не велосипеды изобретать.
0
Evg
Эксперт CАвтор FAQ
21279 / 8301 / 637
Регистрация: 30.03.2009
Сообщений: 22,659
Записей в блоге: 30
27.11.2012, 08:58 17
Цитата Сообщение от silent_1991 Посмотреть сообщение
Мой комментарий относился к случаю, когда шишки уже набиты, и надо код писать, а не велосипеды изобретать.
Это-то понятно. Просто форум - он всё-таки в первую очередь для начинающих и я высказался именно под этим углом.
0
27.11.2012, 08:58
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
27.11.2012, 08:58
Помогаю со студенческими работами здесь

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

Как узнать, что заданная переменная - это указатель?
Здравствуйте, подскажите пожалуйста - Как узнать что, какая то, переменная это указатель?...

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

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


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

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

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru