【发布时间】:2020-06-17 05:16:28
【问题描述】:
我有一个指向结构数组的指针的问题。
我声明并初始化三个点到具有成员val 的结构。
我创建了一个指向结构指针数组的指针arr。
然后我创建一个指针pa 指向指针arr 和一个指针pa1 指向pa。
当我尝试使用pa1 提取arr 的第二个元素时遇到问题。
main.cpp
#include<iostream>
#include<cstdio>
struct a{
int val;
};
int main(){
// create structures
a *a1 = new a;
a1->val = 5;
a *a2 = new a;
a2->val = 3;
a *a3 = new a;
a3->val = 4;
a *arr[3] = { a1, a2, a3 };
a **pa = arr;
std::cout << "Using pa:\n";
std::printf( "1st val: %d\n", (*(pa+0))->val );
std::printf( "1st pos: %p\n", (*(pa+0)) );
std::printf( "2nd val: %d\n", (*(pa+1))->val );
std::printf( "2nd pos: %p\n", (*(pa)+1) ); // modified
std::cout << std::endl << std::endl;
// a pointer to pa's value
a *pa1 = *pa;
std::cout << "Using pa1:\n";
std::printf( "1st val: %d\n", pa1->val );
std::printf( "1st pos: %p\n", pa1 );
std::printf( "2nd val: %d\n", (pa1+1)->val );
std::printf( "2nd pos: %p\n", pa1+1 );
delete a1, a2, a3;
return 0;
}
然后我得到如下结果,
Using pa:
1st val: 5
1st pos: 0000000000e761e0
2nd val: 3
2nd pos: 0000000000e761e4
Using pa1:
1st val: 5
1st pos: 0000000000e761e0
2nd val: 0
2nd pos: 0000000000e761e4
问题是为什么pa1的2nd val不是3而是0?
pa 和 pa1 似乎都指向同一个地址 0000000000e761e4。
更新
// modified 应该是 std::printf( "2nd pos: %p\n", *(pa+1) );。
结果如下
Using pa:
1st val: 5
1st pos: 0000000000ee61d0
2nd val: 3
2nd pos: 0000000000ee61f0
Using pa1:
1st val: 5
1st pos: 0000000000ee61d0
2nd val: 0
2nd pos: 0000000000ee61d4
pa 和pa1 的2nd pos 实际上并不相同。
现在的问题是如何使用pa1 从arr 获取第二个元素?
【问题讨论】:
-
我认为你不能
delete pa1;和其他人,就此而言。 -
pa1+1是(*pa)+1。为什么你认为这与*(pa+1)相同? -
让你感到困惑的是 std::printf( "2nd pos: %p\n", ((*pa)+1) );这应该是 std::printf("2nd pos: %p\n", (*(pa+1)) );以匹配您在上面的行中的内容。这将表明它们没有指向同一个地址。
-
@SouravGhosh 这些删除都无效(也许 pa1 删除了 a1)。他们都试图删除堆栈变量
arr。并且分配的a1..a3仍然存在。 -
@CraigR 谢谢。我已经更新了我的问题。