【发布时间】:2016-11-10 10:08:57
【问题描述】:
我想根据变量的值将指针转换为两个结构之一。我正在尝试这个,但它不起作用 -
struct typeA
{
int a;
int x;
}
struct typeB
{
int b;
int a;
int x;
int z;
}
int band=1;
void *ptr;
if(band == 1)
ptr = (struct typeA *)malloc(sizeof(struct typeA));
else if(band == 2)
ptr = (struct typeB *)malloc(sizeof(struct typeB));
printf("A:%d",ptr->a);//error: structure type required instead of void
最好的方法是什么?
编辑:添加结构定义和错误(在代码 cmets 中)以使其更有意义。
【问题讨论】:
-
C 中不需要强制转换。(同样
ptr是void *)请解释“不工作”。 -
我投了反对票,因为你说你的代码不起作用,但你没有说为什么,编译器给你的错误或警告是什么。修改您提供此信息的问题,我将删除我的反对票。
-
停止投射
malloc(),但给ptr一个真实的类型。如果确实有充分的理由让ptr成为void *那么为什么不分配两个大小中的较大者呢?而且,咳咳,“它不起作用” 是对您的问题的糟糕描述。包含错误消息! -
好吧,那行不通。编译器需要知道
ptr指向什么类型。我想你可以在每次使用它时投射ptr,但哇,那会很难看。严格来说,您必须取消引用指向其原始类型的指针。 (然而,这是一个被广泛忽视的规则。)无论如何,这是高级 C,现在,声明两个具有两种不同类型的指针。 -
if(band == 1){ ptr = malloc(sizeof(struct typeA)); /* ...set a... */ printf("A:%d\n", ((struct typeA*)ptr)->a); }else if(band == 2){ ptr = malloc(sizeof(struct typeB)); printf("A:%d\n", ((struct typeB*)ptr)->a); }
标签: c struct void-pointers