[英]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 语句指数)证明我的假设是错误的。 我在这里错过了什么?
这个问题还不清楚,但我还是会尝试回答:
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.