在事件系统中无效指针

时间:2013-02-02 20:19:41

标签: c events

我正在编写一个事件系统,程序员可以在其中创建自己的事件,但是我遇到了传递事件数据的void指针的问题。事件系统大致如下:

typedef enum { ... USER_EVENT ...} event_type;

typedef struct {
    int id;
    void* data;
} user_event;

typedef struct {
    event_type type;
    union {
        ...
        user_event user;
        ...
    };
} event;

所以我正在编写一个用户事件,使用我自己的自定义结构,并将其传递给此函数:

void add_user_event(int id, void* data) {
    event e;
    user_event u;
    u.id = id;
    u.data = data;
    e.type = USER_EVENT;
    e.user = u;
    add_event(e); /* add_event is just a function that adds the event to the event stack, and it works fine with predefined events */
}
...
add_user_event(my_user_event_id, (void*)&data);

然后我像这样检索它:

...
if (e.type == USER_EVENT && e.user.id == the_user_id) {
    user_data_struct data = *(user_data_struct*) e.user.data;
    /* do stuff */
}

事情是,这应该有效,但它没有(它只是提供完全乱码的数据)。我确信给出的数据是正常的(做了一些检查),但是它以某种方式得不到正确的数据(可能是错误的指针位置?)。如果这可能有所帮助,其他一些提示是add_user_event调用是在函数内完成的(事件是在函数中定义的)。这会影响到什么吗?

提前致谢,如果不够明确,请告诉我。

1 个答案:

答案 0 :(得分:1)

事实证明,cnicutar指出的问题与void指针或任何东西无关,只是因为事件的数据存储在一个函数中(事件处理程序在函数之后被调用)完成执行,因此数据甚至在它甚至可以访问之前就被销毁了。)

所以这是我的原始代码:

void fire_my_event() {
    my_event_structure ev;
    /* do stuff with ev */
    add_user_event(my_event_id, (void*)&ev);
}
/* ev is now destroyed, before the event handler could be called */

我修改了ev“global”,就像这样:

my_event_structure ev;

void fire_my_event() {
    /* reset ev and set values */
    add_user_event(my_event_id, (void*)&ev);
}
/* ev will not be destroyed until the end of the program */