【发布时间】:2022-01-23 21:46:09
【问题描述】:
我正在尝试找出这种情况下的正确语法:
- 为对象分配双指针
- 取回那个双指针的原始地址
这是一个代码示例:
typedef struct obj2{
obj1 **ptr;
} obj2;
void func(obj1 **dbl)
{
obj2 *tmp = malloc(sizeof(obj2));
printf("before; dbl address is %p\n", (void*)&dbl); // 0x7fff6a1362a0
tmp->ptr = dbl;
// here; trying to print the same address as the first printf
printf("after; dbl address is %p\n", (void*)(tmp->ptr)); // 0x7fff6a136280
}
我做错了什么?
编辑:
这样做的用例是我可以在代码库的其他地方使用dbl,所以这里的最终目标只是能够正确地传递双指针。
【问题讨论】:
-
问题是
tmp->ptr与dbl的地址不同。它们是具有相同内容的不同对象。dbl的地址将(通常)在堆栈上,而tmp->ptr将在堆上的某个位置。 -
在第一个 printf 中,您使用 ** 的地址,因此您实际上得到了 ***。只需在那里打印 dbl。
-
我不明白你想要达到什么目的。是什么让你认为你实际上做错了什么?你能用minimal reproducible example 证明这一点吗?
-
无法从
tmp->ptr获取dbl的地址。tmp->ptr与dbl具有相同的值,但它们是两个不同的变量。就像任何其他两个变量一样,您无法仅通过知道另一个变量的值和地址来获取变量的地址。 -
我需要访问代码库中其他地方的
dbl,这就是我这样做的原因tmp->ptr = dbl。这样,我可以使用tmp->ptr在其他地方获取它。问题是我在尝试在其他地方使用tmp->ptr时遇到错误——它似乎没有正确引用它。
标签: c pointers variable-assignment