c - 事件系统中的空指针

标签 c events

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

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 调用是在函数内进行的(并且事件是在函数内定义的)。这会影响什么吗?

提前致谢,如果还不够清楚,请告诉我。

最佳答案

事实证明问题是 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 设置为“全局”来修复它,如下所示:

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 */

关于c - 事件系统中的空指针,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14666109/

相关文章:

c - 共享库 (.so) 如何调用在其加载程序代码中实现的函数?

asp.net - ASPX和ASCX之间的事件

javascript - 在 Chrome 扩展中使用 JavaScript

c# - 在没有外部委托(delegate)定义的情况下定义 C# 事件

c - 为什么在等待条件变量时需要 while 循环

c - 如何将 malloc 与 madvise 一起使用并启用 MADV_DONTDUMP 选项

c - 这个从 C 代码转换而来的 MIPS 汇编代码正确吗?

c - 在 C 语言中,当我在另一个文件中声明一个不同数据类型的全局变量时,为什么没有出现错误?

javascript - iframe 何时重新加载?

javascript - 如何在 JavaScript 中实现锁