4
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);

最初の 2 つの方法がなぜ失敗したのか疑問に思っています。

ご提案いただきありがとうございます。

構造:

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;
}
4

3 に答える 3

4

優先順位が間違っています。たとえば、次のようにする必要があります

(*channel)->id
于 2013-01-21T09:18:42.503 に答える
3

演算子の優先順位が間違っています。->operator は operator よりも優先順位が高くなり.ます。だから、それを作る->前に評価されるのは間違っています。.*(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;
}

優先順位については、こちらをご覧ください。

于 2013-01-21T09:22:11.280 に答える
2

演算子の優先順位によるエラーです。これを試して:

(*channel)->id

演算子"*"は、演算子の後に評価され"->"ます。

于 2013-01-21T09:19:20.797 に答える