C++中如何为结构体分配共享内存?赋值void*报错的快速解决办法
快速解决C++共享内存结构体赋值的类型不匹配错误
嘿,这个问题我太熟了!你遇到的本质是C和C在void*类型转换上的差异——C允许void*隐式转换成任意指针类型,但C为了类型安全,要求必须显式转换,这才导致了gameInfo和void*之间的赋值运算符不匹配错误。
最快的解决办法就是对shmat返回的void*进行显式类型转换,这里有两种常用的实现方式:
方式1:用指针接收共享内存地址(推荐)
直接把转换后的指针赋值给gameInfo*类型的变量,之后通过指针访问结构体成员,这也是最符合共享内存使用逻辑的方式:
#include <sys/shm.h> // 确保包含共享内存头文件 // 假设你的gameInfo结构体定义如下 struct gameInfo { int score; bool isRunning; // ... 其他成员 }; int main() { int shmid = /* 这里是你获取的共享内存ID */; // 显式转换void*到gameInfo* void* shm_raw = shmat(shmid, NULL, 0); // 先检查共享内存挂载是否失败! if (shm_raw == reinterpret_cast<void*>(-1)) { perror("shmat failed"); return 1; } gameInfo* game_data = static_cast<gameInfo*>(shm_raw); // 现在可以正常访问结构体成员了 game_data->score = 100; game_data->isRunning = true; // 用完记得卸载共享内存 shmdt(shm_raw); return 0; }
方式2:赋值给gameInfo对象(如果需要拷贝数据)
如果你确实需要把共享内存里的结构体数据拷贝到一个本地gameInfo对象中,可以解引用转换后的指针来完成赋值:
gameInfo local_game; void* shm_raw = shmat(shmid, NULL, 0); if (shm_raw == reinterpret_cast<void*>(-1)) { perror("shmat failed"); return 1; } // 解引用转换后的指针,完成对象赋值 local_game = *static_cast<gameInfo*>(shm_raw);
关键提醒
一定要记得先检查shmat的返回值!如果挂载失败,它会返回(void*)-1,直接转换的话会导致非法内存访问,引发程序崩溃。
就这么简单,改完就能解决那个类型不匹配的错误啦!
内容的提问来源于stack exchange,提问作者Paulina L
相关产品推荐
相关产品推荐

