解引用指向size_t的指针,但从void指针强制转换
Dereferencing a pointer to size_t, but cast from void pointer
基本上,我将用户生成的事件推入SDL事件队列。在这样做时,我将一个整数的地址压入一个void指针,该指针是SDL_PushEvent()的data1参数。
之后,我尝试在从队列中获取的事件中解引用void指针。然而,当我这样做时,我应该得到的值(1002)与我实际得到的值相差甚远:140733847900856。
我最初是从一个void指针转换为一个整型指针。唉,我使用的是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 data1
超出splash.cpp
的范围时,它被自动删除。
当event->user.data1
在events.cpp
中被解引用时,你会得到堆栈上这个地址在那一刻发生的任何东西。这个指针被称为悬空指针,解引用会导致未定义的行为。在你的例子中,你得到一个"随机"的数字作为结果。通常情况下,你会得到一个分段错误。
你可能想在堆上为你想做的事情分配这个变量,例如
size_t *data1 = new size_t(MAIN_MENU_MODE);
,并记得删除它时,你不再需要它!
您的data1
,这是您在tmp.user中存储其地址的对象。Data1 是if的本地数据。
因此,它将在退出块时被销毁,并且您将留下一个悬空指针。
您可能希望在堆上分配data1
,而使用new
。
- 为什么向量内部的指针在从函数返回时会发生变化?
- 将指针传递到成员的指针,从模板参数包到函数对象
- 如何使用指针直接从托管代码中的非托管代码中读取矢量数据
- 如何在 cuda 中将结构的指针变量从主机复制到设备
- 从大范围内生成一个随机数,但从大范围的中间开始生成较小的范围
- 安卓游戏调试正常,但从Play商店下载时崩溃
- 创建一个没有指针但有索引的链表
- 一个类中的QT信号/插槽,但从不同的线程发出
- 简单的cin cout代码由"build and run"运行,但从bin/debug/x开始工作.exe
- 调用指针参数从const函数指向的对象的操作员
- 当c++程序结束时,指针会从内存中释放吗
- 继承基类,定义基类的原型方法,但从第三个对象调用子类的方法
- 代码运行良好,但从 main() 返回时崩溃
- 将数组指针访问从C++转换为Delphi
- 指针行为从void*到unsigned char*的奇怪情况
- 将指针传递到结构数组的指针,从 C# 传递到 C++
- 从C++调用C++DLL是可行的,但从C#调用则不然
- 编译错误:"指针只能从另一个指针中减去"
- 取消引用无效指针但不使用结果是否是C++中的未定义行为
- 解引用指向size_t的指针,但从void指针强制转换