【问题标题】:C: Accessing pointer to pointer to struct element from pointer to structureC:从指向结构的指针访问指向指向结构元素的指针
【发布时间】:2017-01-04 22:35:48
【问题描述】:

我想从双指针访问结构的成员,但我得到了错误

“错误:‘(’标记之前的预期标识符”

struct test{
  struct foo **val;
};

struct foo{
  int a;
}

int main (){
  struct test *ptr = (struct test *)malloc(sizeof(struct test));
  ptr->val = &foo;
  /*foo is already malloced and populated*/
  printf ("Value of a is %d", ptr->(*val)->a);
}

我也试过了:

*ptr.(**foo).a

【问题讨论】:

  • 你在寻找类似(*(ptr->val))->a的东西吗?
  • struct foo 是一个类型。它没有地址。
  • @AlexD Aweseome,错误消失了,但值显示为“null”。我有一个 struct foo,它是 malloced 的,它的元素“a”在外部函数中被分配了一些值。为了保持这个值,我分配了一个指针 ptr->val = &foo。但是当我尝试打印这个值时,它显示为 null。
  • @user2816078 看到我的新答案!这就是你想要的吗?
  • 除其他外,您在 struct foo 的声明中缺少分号。

标签: c pointers struct operators pointer-to-pointer


【解决方案1】:

你想这样做:

#include <stdio.h>
#include <stdlib.h>

struct test {
    struct foo **val;
};

struct foo {
    int a;
};

int main(void) {
    struct test* test_ptr = malloc(sizeof(struct test));
    struct foo* foo_ptr = malloc(sizeof(struct foo));
    foo_ptr->a = 5;    // equivalent to (*foo_ptr).a = 5;
    test_ptr->val = &foo_ptr;
    printf ("Value of a is %d\n", (*(test_ptr->val))->a);
    free(test_ptr);
    free(foo_ptr);
    return 0;
}

输出:

C02QT2UBFVH6-lm:~ gsamaras$ gcc -Wall main.c 
C02QT2UBFVH6-lm:~ gsamaras$ ./a.out
Value of a is 5

在我的例子中:

  1. 我为struct test 动态分配空间。
  2. 我为struct foo 动态分配空间。
  3. 我将值 5 分配给 foo_ptr 的成员 a
  4. 我将分配对象struct foo的地址分配给 test_ptr 的成员 val
  5. 我打印成员a双指针val指向的结构 到。

注意,在您的示例中:struct foo 是一个类型,因此询问其地址是没有意义的。

另外,当您完成struct foo 的声明时,您缺少一个分号。

哦,请确保not to cast the return value of malloc()

【讨论】:

    【解决方案2】:

    ptr-&gt;val = &amp;foo; 中,foo 是一个结构体(您在第 5 到第 7 行中声明了它)。获取其地址不会给出**,而只会给出*

    此外,似乎多个事物具有相同的名称; foo 是结构或它的实例的名称,还是两者兼而有之?

    然后,当您取消引用它时:ptr-&gt;(*val)-&gt;a 似乎是错误的顺序。 因为ptr-&gt;valfoo 的地址(这是你在上面一行中指定的),所以ptr-&gt;(*val) 是什么??

    我认为ptr-&gt;val.a 会给你你的a。但是,val 仍被声明为** 并始终用作*。它可能有效,但意义不大。

    【讨论】:

    • foostruct foo 不相关(结构标签与其他名称具有单独的“命名空间”)。但即使它们是同一个东西,你也不能取一个类型的地址
    • 那是我的观点。当然,您可以将所有事物命名为相同的名称,并相信编译器会对其进行整理。但这无助于代码的可维护性和人类理解。最好给它起不同的名字,即使不是必需的。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-02-02
    • 1970-01-01
    • 1970-01-01
    • 2021-07-14
    • 1970-01-01
    • 2023-02-16
    相关资源
    最近更新 更多