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

Why uninitialized pointers cause mem access violations close to 0?

本文关键字:接近 mem 访问冲突 初始化 指针 为什么      更新时间:2023-10-16

据说,当你在接近零的内存位置(如 89 美元(获得 AV 时,通常(但并非总是如此(,你有一个未初始化的指针。
但我在德尔菲的书中也看到过这种情况......嗯......或者它们都是由同一作者撰写的???


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

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

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

这会

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

具有

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

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

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

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

它们可以很好地包含像$FFFFFFF这样的值。

还是普通的随机数?

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

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

你关于 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