Что означает «дикий указатель» в C? - PullRequest
22 голосов
/ 06 апреля 2010

Может кто-нибудь сказать мне, значение дикого указателя в C, как его получить и доступно ли это в C ++?

Ответы [ 11 ]

49 голосов
/ 06 апреля 2010

Стандарт не определяет и не использует термин «дикий».Я бы осторожно «исправлял» мнения других людей о том, что это значит, и особенно избегал бы цитирования случайных ненормативных интернет-мусоров в поддержку своей позиции.

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

int main(void)
{

   int *p;  // uninitialized and non-static;  value undefined
   { 
      int i1; 
      p = &i1;  // valid 
   }            // i1 no longer exists;  p now invalid    

   p = (int*)0xABCDEF01;  // very likely not the address of a real object

   { 
      int i2;  
      p = (int*)(((char*)&i2) + 1);  // p very likely to not be aligned for int access
   }

   {
      char *oops = (char*)&p;  
      oops[0] = 'f';  oops[1] = 35;  // p was clobbered
   }
}  

и так далее, и так далее.Есть разные способы получить недопустимое значение указателя в C. Мой любимый - это парень, который пытался «сохранить» свои объекты, записав их адреса в файл.Как ни странно, когда он читал эти значения указателя во время другого запуска программы, они больше не указывали на его объекты.Фантазия, это.

Но для меня это просто дикий смысл.Поскольку это не нормативный термин, он означает, что бы тот, кто говорил или писал, имел в виду это.Спроси его или ее.

10 голосов
/ 06 апреля 2010

Дикий указатель в C - это указатель, который не был инициализирован до его первого использования. От Википедия :

Дикие указатели создаются путем пропуска необходимая инициализация до первое использование. Таким образом, строго говоря, каждый указатель в языках программирования которые не обеспечивают инициализацию начинается как дикий указатель.

Это чаще всего происходит из-за прыжков по инициализации, а не по опуская это. Большинство компиляторов способны предупредить об этом.

например

int f(int i)
{
    char* dp;    //dp is a wild pointer
    ...
}
5 голосов
/ 06 апреля 2010

Это не стандартный термин. Обычно используется для ссылки на указатели, указывающие на недопустимое расположение в памяти. int *p; *p = 0; //P is a wild pointer

или

int *p = NULL;
{
  int a;
  p = &a; // as soon as 'a' goes out of scope,'p' is pointing to invalid location
}

*p = 0;
3 голосов
/ 06 апреля 2010

Чтобы получить дикий (ака висящий) указатель, вы:

  • Создать объект
  • Создать указатель на этот объект
  • Удалить объект
  • Забудьте установить указатель на ноль

Указатель теперь классифицируется как «дикий», поскольку он указывает на произвольный фрагмент памяти, и использование его в этом состоянии может вызвать проблемы с вашей программой.

2 голосов
/ 06 апреля 2010

Подстановочный указатель - это любой указатель, который используется (в частности, как L_value {т.е. (* pointer) = x}), имея значение, которое либо неверно, либо больше не корректно. Его также можно использовать для описания использования памяти, которая не определена как указатель в качестве указателя (возможно, следуя за диким указателем или используя устаревшие определения структуры).

Официального определения нет. Это просто слова, которые мы используем при обращении к определенным ошибкам указателя или результатам этих ошибок.

2 голосов
/ 06 апреля 2010

Указатель, который не инициализирован ни с одним адресом, называется диким указателем. Он может содержать любой адрес мусора, поэтому разыменование дикого указателя опасно

1 голос
/ 24 августа 2011

Дикий указатель - это указатель, который не указывает ни на действительный объект (указанного типа, если применимо), ни на различимое нулевое значение, если применимо.

Подробнее о Wild Pointer здесь

1 голос
/ 06 апреля 2010

Wiki

Это указатель на неинициализированный объект или объект с плохим состоянием. использование этого указателя вызовет проблемы. Вики - хороший источник объяснений.

0 голосов
/ 15 мая 2018

Дикий указатель - это указатель, объявление которого присутствует, но оно еще не определено. Значит, мы объявили указатель - data_type * ptr; // но не определить, какой адрес он содержит * ptr = 100 // дикий указатель не указывает ни на один действительный адрес. поэтому мы получим ОШИБКУ printf ("ptr:% d", ptr); // мы получим: 0 (в компиляторе gcc)

0 голосов
/ 26 июля 2013

Неинициализированный указатель называется Wild Pointer. Предположим, если вы попробуете

int * p; // указывающий на любое случайное или неизвестное местоположение. * р = 16; / Некоторая неизвестная область памяти повреждена. Это никогда не должно быть сделано. /

Это может создать большую угрозу для вашей программы. B'Coz, потому что они указывают на какую-то произвольную область памяти, и изменение содержимого этой области может привести к сбою программы или плохому поведению.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...