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

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

Войти
Регистрация
Восстановить пароль
 
 
Рейтинг: Рейтинг темы: голосов - 31, средняя оценка - 4.84
ledkets
0 / 0 / 0
Регистрация: 22.06.2010
Сообщений: 25
#1

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

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

Появился вопрос, как узнать в C++ инициализирован ли определенный указатель?
0
Лучшие ответы (1)
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
29.06.2011, 18:54
Я подобрал для вас темы с готовыми решениями и ответами на вопрос Как узнать, инициализирован ли указатель? (C++):

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

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

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

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

Узнать указывает ли указатель - C++
Доброго времени суток. Постановка задачи такова: есть указатель на массив, надо удалить массив, а потом создать новый, но не ясно указывает...

узнать количество элементов через указатель - C++
#include"cards.h" #include"cards2.h" #include<string> #include<iostream> #include<conio.h> #include<vector> template<class T>...

16
nameless
Эксперт С++
338 / 302 / 14
Регистрация: 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
oxotnik
1601 / 1078 / 36
Регистрация: 21.08.2008
Сообщений: 4,540
Записей в блоге: 1
29.06.2011, 21:43 #3
Цитата Сообщение от ledkets Посмотреть сообщение
Появился вопрос, как узнать в C++ инициализирован ли определенный указатель?
в общем случае никак
0
Net_Wanderer
235 / 208 / 19
Регистрация: 08.06.2011
Сообщений: 467
29.06.2011, 22:23 #4
Мне вобще непонятно, как можно считать NULL указатель не инициализированным, таковым можно считать указатель который был обьявлен и ему не было присвоено никакое значение, а когда вы пишете
C++
1
 int* ptr = NULL;
то вы инициализируете указатель значением NULL и он уже содержит в себе не мусор, а определенное значение которое гарантированно не является валидным адресом обьекта в памяти.
0
Bers
Заблокирован
29.06.2011, 22:26 #5
Цитата Сообщение от Net_Wanderer Посмотреть сообщение
Мне вобще непонятно, как можно считать NULL указатель не инициализированным, таковым можно считать указатель который был обьявлен и ему не было присвоено никакое значение, а когда вы пишете
C++
1
 int* ptr = NULL;
то вы инициализируете указатель значением NULL и он уже содержит в себе не мусор, а определенное значение которое гарантированно не является валидным адресом обьекта в памяти.
Инициализация указателя - это присваивание ему явного значения.
Что бы проверить, что указатель содержит не мусор (явное значение), нужно либо проверить содержимое указателя в режиме "чтение-только" на предмет какого нить симафора (первый байт должен содержать то-то и то-то. Хотя сие не есть панацея), либо на равенство к нулю (указатель инициализирован, но выключен)
0
Evg
Эксперт CАвтор FAQ
18911 / 6870 / 503
Регистрация: 30.03.2009
Сообщений: 19,346
Записей в блоге: 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
NEW_NAME
1 / 1 / 0
Регистрация: 04.10.2012
Сообщений: 45
26.11.2012, 21:49 #7
Действительно никак что ли? Просто если не для себя пишешь и надо узнать выделялась ли для указателя память, чтобы знать нужно ли ее высвободить в функции перед тем, как заново выделить
0
ps10n1ck
54 / 48 / 2
Регистрация: 10.11.2010
Сообщений: 132
26.11.2012, 21:55 #8
Цитата Сообщение от NEW_NAME Посмотреть сообщение
Действительно никак что ли? Просто если не для себя пишешь и надо узнать выделялась ли для указателя память, чтобы знать нужно ли ее высвободить в функции перед тем, как заново выделить
для этого указатель в самом начале инициализируют 0 (NULL), а потом проверяют на равенство 0
0
v.a.l.i.d
416 / 381 / 10
Регистрация: 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
OhMyGodSoLong
~ Эврика! ~
1245 / 994 / 42
Регистрация: 24.07.2012
Сообщений: 2,002
26.11.2012, 22:07 #10
Смарт-поинтеры решат если не все, то по крайней мере большинство проблем, связанных с неинициализированностью, обращению к нуллам и обращению к убитым объектам.

> почему то печатает что "указатель инициализирован"! непонятно
Потому что delete не изменяет значение указателя, он только вызывает деструктор и освобождает выделенную память.
1
ps10n1ck
54 / 48 / 2
Регистрация: 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
18911 / 6870 / 503
Регистрация: 30.03.2009
Сообщений: 19,346
Записей в блоге: 30
26.11.2012, 23:00 #12
Цитата Сообщение от ~OhMyGodSoLong~ Посмотреть сообщение
Смарт-поинтеры решат если не все, то по крайней мере большинство проблем
На самом деле большинство проблем решают наличие головы и опыта работы, потому что начинаешь понимать, где лежат грабли и куда стелить солому. А если голова дурная, то уже мало что спасёт
0
OhMyGodSoLong
26.11.2012, 23:17
  #13

Не по теме:

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

0
silent_1991
Эксперт С++
5006 / 3064 / 149
Регистрация: 11.11.2009
Сообщений: 7,043
Завершенные тесты: 1
26.11.2012, 23:40 #14
Evg, думаю, смартпоинтеры будут понадёжнее самой НЕдурной головы всё же.
0
Evg
Эксперт CАвтор FAQ
18911 / 6870 / 503
Регистрация: 30.03.2009
Сообщений: 19,346
Записей в блоге: 30
27.11.2012, 00:15 #15
Лучший ответ Сообщение было отмечено автором темы, экспертом или модератором как ответ
Цитата Сообщение от ~OhMyGodSoLong~ Посмотреть сообщение

Не по теме:

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

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

Вот лично моё мнение, что работать с умными указателями для начинающих - это не правильно. Начинающему крайне важно получить граблями по лбу, чтобы научиться самому стелить солому, там, где надо. А горничных надо звать только тогда, когда сам научился стелить, и процесс застилания соломы превращается в рутину и потерю времени. А когда с детства приучаешься к тому, что солому стелит горничная, то в итоге вырастают программисты-индусы. Это всего лишь моё мнение, которое основано на многолетнем собственном опыте и опыте работы в команде, в которой есть любители горничных (к сожалению, в реальной жизни от таких никуда не денешься). Я ни в коем случае не отрицаю, что нужно использовать результаты научно-технического прогресса. Но хороший специалист просто обязан знать фундаментальные вещи и понимать, откуда растут фундаментальные проблемы
3
27.11.2012, 00:15
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
27.11.2012, 00:15
Привет! Вот еще темы с ответами:

Как правильно удалять выделенную память под указатель на указатель? - C++
есть код #include &lt;iostream&gt; #include &lt;conio.h&gt; #include &lt;stdlib.h&gt; #include &lt;time.h&gt; using namespace std; void sort_1(const...

Узнать номер элемента массива на который указывает указатель - C++
Может вопрос глупый но тока что об этом задумался! Можно ли узнать номер элемента массива на который указывает указатель не используя...

Расскажите, как здесь работает указатель на указатель? - C++
#include &quot;stdafx.h&quot; #include &lt;iostream&gt; #include &lt;locale.h&gt; using namespace std; void main() { setlocale(LC_ALL, &quot;rus&quot;); ...

Почему указатель на указатель объявляется как float **A; - C++
Почему float?


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

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

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