为什么未初始化的指针会导致接近 0 的 mem 访问冲突
Why uninitialized pointers cause mem access violations close to 0?
据说,当你在接近零的内存位置(如 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
- 查找最接近的大于当前数字的数字的索引
- 班级的朋友是不可接近的
- 必须首先打印向量 v1 中最接近整数 x 的数字<int>
- 如何处理 c++ 中接近零的值?
- 静态库大小接近 400MB
- 查找索引的最接近的真实值
- 如何优化代码以返回最接近给定整数的数字,但给定列表中不存在?
- C++ lower_bound() 搜索最接近目标值的元素
- C++有效地找到向量中第一个最接近的匹配值?
- 在结构向量中查找最接近的值
- 在排序数组中搜索最接近的 int 值 <= 从右起给定值
- 当相机接近模型时,SSAO样本内核会导致性能下降?
- 最接近"std::atomic<std::vector>"是什么?
- C++中最接近 Lua 表操作的东西是什么?
- 在std::集中获取与给定元素最接近的元素
- 查找整数数组中最接近的数字
- Systemc - 将sc_time四舍五入到最接近的第 10 SC_NS
- (C++)如何在不导致 mem 泄漏的情况下将指针传递到分配了'new'的函数?
- 我是 c++ 的新手,有没有一种算法可以找到 3d 数组中最接近的 0 的距离?
- 为什么未初始化的指针会导致接近 0 的 mem 访问冲突