为什么未初始化的指针会导致mem访问冲突接近于0?

时间:2019-02-07 09:39:07

标签: c++ delphi access-violation

据说经常(但并非总是如此),当您在接近零的内存位置(例如$ 89)获得AV时,您会得到未初始化的指针。
但是我在Delphi的书中也看到了这一点……嗯……或者它们都是由同一位作者写的?


更新:
引用来自Bob Swart等人的“ C ++ Builder 6开发人员指南”,第71页:

  

当存储器地址ZZZZZZZZZ接近零时,原因通常是   已访问的未初始化指针。

为什么会这样?为什么未初始化的指针包含低数字?为什么不使用$ FFFFFFF这样的大数或普通随机数呢?这是都市神话吗?

3 个答案:

答案 0 :(得分:13)

这会使“未初始化的指针”与空引用或空指针混淆。对对象字段的访问或对指针的索引,将表示为相对于基本指针的偏移量。如果该引用为null,则偏移通常是接近零的地址(对于正偏移)或接近本机指针大小的最大值的地址(对于负偏移)。

具有这些特征小值(或大值)的地址的访问冲突是您具有 空引用 空指针< / em> ,而不仅仅是 未初始化的指针 。未初始化的引用可以具有null值,但也可以具有任何其他值,具体取决于分配方式。

答案 1 :(得分:7)

  

为什么未初始化的指针包含低数字?

他们没有。它们可以包含任何值。

  

为什么没有像$ FFFFFFF这样的大数字?

它们可以很好地包含$ FFFFFFF之类的值。

  

还是纯随机数?

未初始化的变量往往不是真正的随机变量。它们通常包含上次使用时碰巧写入该内存位置的任何内容。例如,每次调用一个函数时,未初始化的局部变量都包含相同的值是很常见的,因为堆栈使用的历史恰好是可重复的。

也有必要指出随机是一个经常被滥用的词。人们通常说随机,实际上是指随机分布且均匀分布。我希望这就是您使用随机一词时的意思。

答案 2 :(得分:5)

您对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