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

Why uninitialized pointers cause mem access violations close to 0?

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


更新:
引自 Bob Swart 等 "C++ builder 6 developers guide",第 71 页:

When the memory address ZZZZZZZZZ is close to zero, the cause is often an uninitialized pointer that has been accessed.

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

Why uninitialized pointers contain low numbers?

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

Why not big numbers like $FFFFFFF?

它们完全可以包含 $FFFFFFF 这样的值。

or plain random numbers?

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

另外值得指出的是,随机是一个经常被误用的词。人们经常说随机,而实际上他们指的是均匀分布的随机分布。我希望这就是您使用随机一词时的意思。

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

具有这些小(或大)特征值的地址的访问冲突是一个很好的线索,表明您有一个 空引用空指针,具体来说,不仅仅是一个未初始化的指针 .未初始化的引用可以有空值,但也可以有任何其他值,具体取决于它的分配方式。

您关于取消引用空指针的 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