如何从指针访问结构成员

时间:2019-04-03 04:25:44

标签: c

在将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;
  }
}

2 个答案:

答案 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;
    }
}

但是您的演员表不应用于任何事物。我更喜欢通过将其分配给一个临时的局部变量来使转换明确。我觉得这使结果代码更具可读性,因为这里和那里都没有类型转换。