我正在編寫一個事件系統,程序員可以在其中創建自己的事件,但我遇到了用於傳遞事件數據的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
調用是在一個函數內進行的(並且該函數是在該函數內定義的)。這會影響到什麼嗎?
在此先感謝,並讓我知道如果這不夠清楚。
在'add_user_event(my_user_event_id,(無效*)&data);'如何是數據定義的嗎?它可能是某個函數的局部對象嗎? – cnicutar
@cnicutar,是的,「對象」是在一個函數中定義的,如果這就是你的意思 – MiJyn
它是否能夠存活足夠長的時間來取消引用它? – cnicutar