这是我的代码:
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
答案 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;
}