Почему неинициализированные указатели вызывают нарушения доступа к памяти, близкие к 0? - PullRequest
0 голосов
/ 07 февраля 2019

Говорят, что часто (но не всегда), когда вы получаете AV в области памяти, близкой к нулю (например, $ 89), у вас есть неинициализированный указатель.
Но я видел это такжев книгах Delphi ... Хм ... или все они написаны одним и тем же автором (-ами) ???


Обновление:
Цитата из "Руководства разработчика C ++ Builder 6"Боб Сварт и все, стр. 71:

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

Почемуэто так?Почему неинициализированные указатели содержат низкие числа?Почему не большие числа, такие как $ FFFFFFF или простые случайные числа?Это городской миф?

Ответы [ 3 ]

0 голосов
/ 07 февраля 2019

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

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

0 голосов
/ 07 февраля 2019

Ваше утверждение о AV, близком к нулю, верно для разыменования нулевого указателя.Он равен нулю или близок к нулю, поскольку вы либо разыменовываете нулевой указатель:

int* p{};
const auto v = *p; // <-- AV at memory location = 0

, либо обращаетесь к элементу массива:

char* p{};
const auto v = p[100]; // <--AV at memory location = 100

или к полю структуры:

struct Data
{
  int field1;
  int field2;
};

Data* p{};
const auto v = p->field2; // AV at memory location = 4
0 голосов
/ 07 февраля 2019

Почему неинициализированные указатели содержат младшие числа?

Они не имеют.Они могут содержать любое значение.

Почему бы не большие числа, такие как $ FFFFFFF?

Они могут прекрасно содержать значения, такие как $ FFFFFFF.

или простые случайные числа?

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

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

...