取消引用指向结构的指针

时间:2013-01-21 09:16:47

标签: c pointers structure operator-precedence

gcc 4.7.2
c89

您好,

我试图取消引用指向结构的指针,当我执行以下操作时收到此错误消息:

LOG_INFO("CHANNEL ID --- %d", *channel->id);

编译错误

request for member ‘id’ in something not a structure or union

如果我尝试将其转换为正确的指针类型,我仍然会收到相同的错误消息:

LOG_INFO("CHANNEL ID --- %d", (*(channel_t*)channel->id));

我通过声明一个新变量并指定结构指向的地址来解决问题:

channel_t *ch = NULL;
ch = *channel;
LOG_INFO("CHANNEL ID --- %d", ch->id);

我只是想知道为什么前两种方法都失败了。

非常感谢任何建议,

结构:

typedef struct tag_channel channel_t;
struct tag_channel {
    size_t id;
    char *name;
};

我称之为:

channel_t *channel = NULL;
channel = (channel_t*)apr_pcalloc(mem_pool, sizeof *channel);
LOG_CHECK(job_queue_pop(queue, &channel) == TRUE, "Failed to pop from the queue");

功能,我遇到了麻烦:

apr_status_t job_queue_pop(apr_queue_t *queue, channel_t **channel)
{
    apr_status_t rv = 0;
    channel_t *ch = NULL;

    rv = apr_queue_pop(queue, (void**)channel);
    if(rv != APR_SUCCESS) {
        char err_buf[BUFFER_SIZE];
        LOG_ERR("Failed to pop from the queue %s", apr_strerror(rv, err_buf, BUFFER_SIZE));

        return FALSE;
    }

    ch = *channel;  
    LOG_INFO("CHANNEL ID --- %d", ch->id);
    LOG_INFO("CHANNEL NAME - %s", ch->name);

    return TRUE;
}

3 个答案:

答案 0 :(得分:4)

你的优先权是错的,应该是例如。

(*channel)->id

答案 1 :(得分:3)

您的运算符优先级错误。 ->运算符的优先级高于.运算符。因此->会在.之前对其进行评估*(channel->id)这是错误的。

查看以下代码。它工作正常。

typedef struct test_
{
   int i;
}test;

int main()
{
   test a;
   test *aptr = &a;
   test **aptrptr = &aptr;
   a.i=6;
   printf("\n%d\n",(*aptrptr)->i);
   return 0;
}

了解优先级here

答案 2 :(得分:2)

operator precendece导致错误。 试试这个:

(*channel)->id

在运算符"*"之后评估运算符"->"