在将void *指针传递给该结构的基地址时,我无法访问该结构的成员。谁能提供解决方案或向我解释错误?现在,我收到消息“ goroutines.c:142:31:错误:请求成员“ qtail”使用非结构或联合的东西”
//Channel struct
struct channel{
int magicnumber;
int length;
int capacity;
struct gcb* qhead; //head of the queue
struct gcb* qtail; //tail of the queue
};
void *makeChannel(int dataLength, int capacity){
if( dataLength <= 0){
panic( "data length must be greater than zero" );
}
if( capacity < 0){
panic( "capacity must be non-negative" );
}
struct channel* ch = (struct channel* )malloc( dataLength * capacity );
ch->magicnumber = 0x1ca91ac3;
ch->capacity = capacity;
ch->length = 0;
return ch;
}
void sendChannel(void *channel, void *fetchAddress){
if( capChannel( channel ) == lenChannel( channel ) ){
(struct channel* )&channel->qtail->next = head;
}
}
答案 0 :(得分:3)
运算符->
的优先级较低,因此首先对其进行评估。 channel
是一个空指针,因此,channel->
取消引用它时,您将获得类型void
的值,而不是预期的struct channel
。
在类型转换和channel
周围添加括号(或将channel
作为struct channel *
而不是void*
传递,以避免重复转换)
((struct channel *)channel)->qtail->next = head;
答案 1 :(得分:3)
取消引用void*
指针无效。取消引用基本上是相对于基指针的数字偏移。如果编译器不知道指针是什么类型,它怎么知道偏移量,也不能决定成员引用是否实际上有效。
在您的函数中它是强制转换的,好像有一个流浪&
。
void sendChannel(void *channel, void *fetchAddress)
{
struct channel *chan = (struct channel *)channel;
if( capChannel( chan ) == lenChannel( chan ) )
{
chan->qtail->next = head;
}
}
但是您的演员表不应用于任何事物。我更喜欢通过将其分配给一个临时的局部变量来使转换明确。我觉得这使结果代码更具可读性,因为这里和那里都没有类型转换。