据说经常(但并非总是如此),当您在接近零的内存位置(例如$ 89)获得AV时,您会得到未初始化的指针。
但是我在Delphi的书中也看到了这一点……嗯……或者它们都是由同一位作者写的?
更新:
引用来自Bob Swart等人的“ C ++ Builder 6开发人员指南”,第71页:
当存储器地址ZZZZZZZZZ接近零时,原因通常是 已访问的未初始化指针。
为什么会这样?为什么未初始化的指针包含低数字?为什么不使用$ FFFFFFF这样的大数或普通随机数呢?这是都市神话吗?
答案 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