为什么未初始化的指针会导致接近 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
据说 经常(但并非总是如此)当你在接近于零的内存位置(如 $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