代码之家  ›  专栏  ›  技术社区  ›  IceCold

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

  •  5
  • IceCold  · 技术社区  · 6 年前

    据说 经常 (但并非总是如此)当您在接近零的内存位置(如$89)获得AV时,您有一个未初始化的指针。
    但我也在德尔福的书中看到过…Hm.…或者都是同一作者写的????


    更新:
    引用Bob Swart等人的《C++Builder 6开发者指南》,第71页:

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

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

    3 回复  |  直到 6 年前
        1
  •  13
  •   J...    6 年前

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

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

        2
  •  7
  •   David Heffernan    6 年前

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

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

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

    它们完全可以包含$fffffff之类的值。

    还是普通随机数?

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

    同样值得指出的是,随机词是一个经常被误用的词。人们通常说随机的时候,其实是指随机分布,分布均匀。我想这就是你用“随机”这个词的意思。

        3
  •  5
  •   Marcin Zawiejski    6 年前

    对于取消引用空指针,关于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