【问题标题】:Get address of double pointer获取双指针地址
【发布时间】: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->ptrdbl 具有相同的值,但它们是两个不同的变量。就像任何其他两个变量一样,您无法仅通过知道另一个变量的值和地址来获取变量的地址。
  • 我需要访问代码库中其他地方的dbl,这就是我这样做的原因tmp->ptr = dbl。这样,我可以使用tmp->ptr 在其他地方获取它。问题是我在尝试在其他地方使用 tmp->ptr 时遇到错误——它似乎没有正确引用它。

标签: c pointers variable-assignment


【解决方案1】:

&dbl是参数dbl的地址,是一个局部变量。

tmp->ptr = dbl;

tmp->ptr 赋值为dbl,而不是变量dbl 的地址。除非您将 dbl 分配给 &dbl,否则这些地址很可能会有所不同(根本没有意义)。

【讨论】:

  • “将 tmp->ptr 赋值为 dbl 保持” - 因为 dbl 是双指针,你是说 tmp->ptr 将拥有 *dbl
  • @robl - 不,我认为你需要练习一些指针,因为它们对你来说是木头黑魔法之王。
【解决方案2】:

在此声明中

tmp->ptr = dbl;

您没有将指针 db1 的地址分配给对象 tmp->ptr。您正在分配存储在指针中的值。

所以这两个 printf 调用输出不同的值

printf("before; dbl address is %p\n", (void*)&dbl); // 0x7fff6a1362a0

// here; trying to print the same address as the first printf
printf("after; dbl address is %p\n", (void*)(tmp->ptr)); // 0x7fff6a136280

你应该改变第一次调用 printf 的方式

printf("before; dbl address is %p\n", (void*)dbl);

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-10-02
    • 1970-01-01
    • 1970-01-01
    • 2018-01-21
    • 1970-01-01
    相关资源
    最近更新 更多