C:从指针到结构访问指向struct元素的指针

时间:2016-08-29 00:29:48

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

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

  

"错误:'('token"

之前的预期标识符

$(document).ready(function()

    {
        alert($("body").css("height"));

    })

我也尝试过:

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);
}

2 个答案:

答案 0 :(得分:0)

你想这样做:

#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分配给a的成员foo_ptr
  4. 我将分配的struct foo对象的地址分配给 val的成员test_ptr
  5. 我打印成员a双指针val指向的结构 到。
  6. 注意,在您的示例中:struct foo类型,因此询问其地址是没有意义的。

    此外,当您完成struct foo声明后,您错过了分号。

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

答案 1 :(得分:-2)

ptr->val = &foo;中,foo是一个结构(你在第5到7行声明它)。取其地址不会产生**,而只会产生*

似乎有很多东西都有相同的名字;是结构或其实例的<{1>} 名称,还是两者兼而有之?

然后,当你取消引用它时:foo看起来确实是错误的序列。 由于ptr->(*val)->aptr->val的地址(这是您在其上方的行中指定的地址),foo会是什么?

我认为ptr->(*val)会为您提供ptr->val.a。但是,a仍被声明为val并始终用作**。它可能有用,但没有多大意义。