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

问题描述 投票:5回答:3

据说,通常(但并不总是)当你在接近零的存储器位置的AV(如$ 88)你有一个未初始化的指针。 但我在德尔福的书籍也看到了这一点......嗯......或者他们已经全部由同一作者(S)写???


更新: 从“C ++构建器6级的开发者指南”由Bob斯沃特等所有,71页引用:

当存储器地址泣鬼神接近于零,其原因常常是已经访问未初始化的指针。

为什么会这样呢?为什么未初始化指针包含低的数字?为什么不大的数字,比如$ FFFFFFF或纯随机数?这是城市的神话?

c++ delphi access-violation
3个回答
13
投票

这是空引用或空指针混淆“未初始化的指针”。访问对象的字段,或索引到一个指针,将被表示为相对于所述基址指针的偏移量。如果该引用为null,则偏移通常将是地址或者接近零(对于正偏移)或地址附近的天然指针大小的最大值(负偏移)。

访问冲突在与这些特征小(或大)值的地址是你有一个空引用或空指针,特别是一个很好的线索,而不是简单地未初始化的指针。未初始化的引用可以有一个空值,但也可能有其他任何价值取决于它是如何分配的。


7
投票

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

他们不知道。它们可以包含任意值。

为什么不能大号码,如$ FFFFFFF?

他们可以非常清楚包含类似$ FFFFFFF值。

或简单的随机数?

未初始化变量往往不是真正随机的。它们通常包含无论发生在已被写入到内存位置,它被用来最后一次。例如,它是很常见的未初始化的局部变量每一个函数被调用堆栈,因为使用的历史恰好是重复的时间包含相同的值。

另外值得指出的是,随机是一个经常被误用的单词。人们常说随机当他们真正的意思是均匀分布的随机分布。我希望是当你使用的术语随机你是什么意思。


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
© www.soinside.com 2019 - 2024. All rights reserved.