繁体   English   中英

当双指针分配给单指针时,memory 布局看起来如何?

[英]How does the memory layout look like when a double pointer is assigned to a single pointer?

我目前正在处理遗留代码(仍然是专有的,所以我们必须使用 MRE 来代替;我所说的遗留代码是指 1991 年编写的代码)。 这就是我遇到的情况:

#include <iostream>

void foo(void*& ptr2) {
    
    // whatever
    
}

int main() {
    int** ptr = new int*[5];
    void* ptr2;
    int i = 1;
    for(int j = 0; j < 5; j++) {
        ptr[j] = new int;
        ptr[j][0] = i++;
    }
    ptr2 = ptr;
    foo(ptr2);

    // further operations here... and a comment which suggests the above was done to prevent accidental double dereferencing when ptr2 was passed by reference to another function
    return 0;
}

在这种情况下, ptr2的逻辑布局如何? 我假设ptr[0][0]变成ptr2[0]ptr[1][0]变成ptr2[1]等等,但是打印语句(MRE 不需要,只是各种标准的 cout 语句指数)证明我的假设是错误的。 我在这里错过了什么?

这个问题还不清楚,但我还是会尝试回答:

  • 投射指针不会改变任何 memory 布局
  • 指针的布局是一些连续的字节(通常是 4 或 8),它们包含 memory 地址。 这不应与指针可能指向的 memory 的布局相混淆。
  • new int *[5]分配的对象的布局是 5 个连续的指针,每个都是int *类型。 与指向这个 memory 块的其他指针混在一起并不会改变这个 memory 块的布局。

foo内部,可以通过使用正确类型恢复其地址来访问由new int *[5]分配的 memory:

void foo(void*& ptr2)
{
     int **ptr = static_cast<int **>(ptr2);

     for(int j = 0; j < 5; j++)
         std::cout << ptr[j] << '\n';
}

尝试访问有问题的 memory 块的任何其他方式都会导致未定义的行为。 (好吧,除了别名为unsigned char )。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM