Что означает "дикий указатель" в C?

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

11 ответов

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

Для меня это будет означать указатель, который не относится ни к легитимному объекту, ни к 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. Мой любимый способ - это парень, который пытался "сохранить" свои объекты, записав их адреса в файл. Странно, когда он считывал эти значения указателя во время другого запуска программы, они больше не указывали на его объекты. Фантазия, это.

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

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

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

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

например

int f(int i)
{
    char* dp;    //dp is a wild pointer
    ...
}

Это не стандартный термин. Обычно он используется для ссылки на указатели, указывающие на недопустимое расположение в памяти.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;

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

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

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

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

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

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

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

Узнайте больше о Wild Pointer здесь

Wiki

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

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

Понтер, у которого нет определения типа данных varable, который называется varable, вызывает дикий указатель

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

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

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

Другие вопросы по тегам