为什么未初始化的指针导致mem访问违规接近0?

WeG*_*ars 5 c++ delphi access-violation

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


更新:
引自Bob Swart等人的"C++ builder 6开发人员指南",第71页:

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

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

J..*_*... 13

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

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


Dav*_*nan 7

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

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

为什么不像$ FFFFFFF这样的大数字呢?

它们完全可以包含$ FFFFFFF等值.

或普通的随机数?

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

值得指出的是,随机是一个经常被滥用的词.当人们实际上意味着随机分布均匀时,人们常说随机.我希望当你使用随机术语时,这就是你的意思.

  • @PasserBy我明确表示不随意 (2认同)

Mar*_*ski 5

对于取消引用空指针,关于AV接近零的陈述是正确的.它为零或接近于零,因为您要么取消引用空指针:

int* p{};
const auto v = *p; // <-- AV at memory location = 0
Run Code Online (Sandbox Code Playgroud)

或访问数组项:

char* p{};
const auto v = p[100]; // <--AV at memory location = 100
Run Code Online (Sandbox Code Playgroud)

或结构字段:

struct Data
{
  int field1;
  int field2;
};

Data* p{};
const auto v = p->field2; // AV at memory location = 4
Run Code Online (Sandbox Code Playgroud)