【问题标题】:Trouble accessing a struct member from a void pointer.从 void 指针访问结构成员时遇到问题。
【发布时间】:2014-05-14 11:55:27
【问题描述】:

我在 C 语言方面的经验并不多,而且我在处理对你们大多数人来说可能很简单的事情时遇到了麻烦。基本上,我有这个结构,它定义了一个带有调整大小数组实现的“通用”队列:

typedef void (*free_fptr)(void *);

typedef struct {
    void **queue;       // pointer to generic type
    size_t first;       // head index in array
    size_t last;        // tail index in array
    size_t size;        // number of elements
    size_t capacity;    // capacity of array
    size_t elem_size;   // size in bytes of each element in queue
    free_fptr deleter;  // function used to free each element
} Queue;

现在,我有一个要放入队列的数据类型:

typedef struct {
    Process_state state;
    Queue time_queue;
    unsigned int start_time;
    unsigned int id;
} Process;

我还有一个函数 'Queue_destroy(Queue *q)' 我想在需要释放队列中的每个元素时调用它:

void
Queue_destroy(Queue *q)
{
    size_t i;

    for (i = 0; i < q->size; ++i) {
        q->deleter(q->queue[(q->first + i) % q->capacity]);
    }

    free(q->queue);

}

现在,我的问题是我不知道从 void 指针访问队列内的“进程”队列。例如:

void
Process_deleter(void *item)
{   
    // Here I want to access the queue inside (Process *)item
    free((Process *)item);
}

我尝试了很多事情都没有成功,例如:

    Queue_destroy((*(Process *)item).time_queue);
    Queue_destroy((Process *)item->time_queue);

它没有编译,我一无所知!

任何帮助将不胜感激!

【问题讨论】:

  • 你sn-ps的代码缺少信息,一团糟。改为提供一个简单的可编译示例。

标签: c struct void-pointers


【解决方案1】:

你的功能:

Queue_destroy(Queue *q)

需要Queue*

所以,改变:

Queue_destroy((*(Process *)item).time_queue); // Here you are passing the object 

到:

Queue_destroy(&(((Process *)item)->time_queue));

假设item 是指向您的struct Process 的指针

【讨论】:

  • 我得到了和我一样的错误:simfb.c:188:33:错误:在不是结构或联合的东西中请求成员“time_queue”
  • 你怎么打电话给Process_deleter()
  • 在我的回答中,我假设您已经使用正确的参数调用了该函数。你也需要证明这一点。另外,你是如何创建结构的对象/指针的?
  • 没关系,它现在正在工作!谢谢你让我明白了! ;)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-01-20
  • 2021-08-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-01-08
相关资源
最近更新 更多