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