将void *转换为struct *并读取struct成员值

时间:2014-11-13 07:06:15

标签: c pointers struct

这是我的代码:

typedef struct{
int a;
} DATA;

int main()
{
  DATA *temp, *temp2;
  void *vtemp;
  temp = (DATA *)malloc(sizeof(DATA));
  temp->a = 5;
  vtemp = &temp;
  printf("set value : %d\n", temp->a);  

  // Some ops //

  temp2 = (DATA *)vtemp;
  printf("got value : %d\n", temp2->a);
  return 0;
}

我应该得到“有价值”为5,但我得到一个随机数如下(可能打印一个地址?):

set value : 5
got value : 7024656

2 个答案:

答案 0 :(得分:4)

temp是结构的地址。当你写:

vtemp = &temp;

您将vtemp设置为变量temp的地址。因此,&temp实际上是DATA**类型。当您将vtemp转换为DATA*类型时,这是一个错误。很简单,vtemp不属于DATA*类型,您的演员表不会改变它。

我想您打算将temp分配给vtemp

vtemp = temp;

答案 1 :(得分:1)

此处temp属于DATA

typedef struct{
    int a;
} DATA;

vtemp = &temp表示vtemp具有temp的地址时,其类型为DATA*而不是DATA。因此,为了取消引用,您应该将vtemp声明为void **

改变vtemp =& temp;到vtemp = temp;以使您的计划有效,或使用void**

检查以下代码
int main()
{
  DATA *temp, *temp2;
  void **vtemp;
  temp = (DATA *)malloc(sizeof(DATA));
  temp->a = 5;

  vtemp = (void *)&temp;

  printf("set value : %d\n", temp->a);  

  // Some ops //

  temp2 = *vtemp;
  printf("got value : %d\n", temp2->a);
  return 0;
}