簡體   English   中英

解引用指向size_t的指針,但從void指針強制轉換

[英]Dereferencing a pointer to size_t, but cast from void pointer

基本上,我將用戶生成的事件推送到SDL事件隊列中。 為此,我將整數的地址壓入void指針,該指針是SDL_PushEvent()的data1參數。

稍后,我嘗試取消引用從隊列中獲取的事件中的void指針。 但是,當我這樣做時,我應該獲得的值(1002)與我實際獲得的值相去甚遠:140733847900856。

我最初是從void指針轉換為整數指針的。 las,我使用的是64位體系結構,因此必須使用size_t。 但是我對size_t的用法並不完全熟悉,所以我可能做錯了什么。

以下是來自兩個不同源文件的代碼段:

來自“ splash.cpp”:

  if(elapsed >= 13000 && !(flag)){
    std::cerr << "13 seconds elapsed.\n";

    // Create and push a CHANGE_GAME_MODE event to the queue.
    SDL_Event tmp;
    size_t data1 = MAIN_MENU_MODE;

    tmp.type=SDL_USEREVENT;
    tmp.user.code= CHANGE_GAME_MODE;
    tmp.user.data1 = &data1;
    tmp.user.data2 = NULL; // Not used.

    std::cerr << "Value of data1 before SDL_PushEvent():"
              << *((size_t*)(tmp.user.data1)) << "\n";

    SDL_PushEvent(&tmp);
    flag = true;
  }

來自events.cpp:

  case SDL_USEREVENT:
    std::cerr << "\nUser event detected: " << *((size_t*)(event->user.data1)) << "\n";
    user_event(event->user.type, event->user.code, event->user.data1, event->user.data2);
    break;

這是我實際運行程序時cerr的結果:

sysadm@druid: ./kolodruidtale 
ALSA lib pcm.c:7843:(snd_pcm_recover) underrun occurred
13 seconds elapsed.
Value of data1 before SDL_PushEvent():1002

User event detected: 140688563309902
ALSA lib pcm.c:7843:(snd_pcm_recover) underrun occurred

(注意:我知道是什么原因導致緩沖區不足,以及如何解決它。不過,我想首先解決此解除引用問題,所以不用擔心。:D)

感謝您的時間。

splash.cpp ,定義一個新變量size_t data1 = MAIN_MENU_MODE; 在堆棧上分配的。 然后,將其地址存儲到tmp.user.data1 size_t data1splash.cpp超出范圍時,它將被自動刪除。

當在events.cpp取消引用events.cpp event->user.data1 ,您會得到此時該堆棧上該地址中的任何內容。 該指針稱為懸掛指針 ,解引用會導致未定義的行為。 在您的情況下,您將得到一個“隨機”數字。 通常,您會遇到細分錯誤。

您可能想在堆上分配此變量以進行嘗試,例如

size_t *data1 = new size_t(MAIN_MENU_MODE);

並記得在不再需要它時將其刪除!

您的data1是對象,其地址存儲在tmp.user.data1 中,位於if的本地

因此,它在退出該塊時將被銷毀,並且您將留下一個懸空的指針。

您可能想使用new在堆上分配data1

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM