繁体   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