You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.19 07:27:04