首页 > 解决方案 > 使用 void 指针:void **ptr... 如何修改共享内存的值?

问题描述

我正在尝试使用一个功能:

void Mem::Attach(void **address)
{
   *address = NULL;
   if ((*address = shmat(memid, *address, 0)) == (void *) -1)
    perror(" stuff .... ");
}

共享内存类:

class Mem {
   private:
        int memid;
   public:
         Mem(key_t key, int dimension);
         void Attach(void **adress);
         void Detach(char *adress);
         void Libere();
};

所以本质上这是一个在Linux(使用system v)进程之间使用共享内存的包装器。

所以我这样调用 Attach() :

void *ptr_shared;                        
mem.Attach(&ptr_shared);

我目前的理解:

但是,如果我尝试这样做,请说:

*ptr_shared = 42;

然后我收到一个 SIGSEGV 错误。

怎么了?是我对指针的理解还是我尝试使用system v的问题?

编辑:遵循迈尔斯的评论(在一定程度上和约翰的评论)。如果我想改为 Attach 返回指向共享内存段的指针......我将如何管理它的类型?当我创建共享内存段时,我使用了 int 的大小。所以...这意味着我绝对必须只将 int 分配到该段中,因此返回的指针类型必须是 int?但是,可能会创建其他内存段来包含字符......所以在这种情况下,我如何管理来自 Attach() 的未知类型的返回指针,这取决于内存段的大小?

我来自 Python 背景,所以我们不做太多类型....

标签: c++pointersposix

解决方案


如果我想改为 Attach 返回指向共享内存段的指针......我将如何管理它的类型?当我创建共享内存段时,我使用了 int 的大小。所以...这意味着我绝对必须只将 int 分配到该段中,因此返回的指针类型必须是 int?但是,可能会创建其他内存段来包含字符......所以在这种情况下,我如何管理来自 Attach() 的未知类型的返回指针,这取决于内存段的大小?

只要有足够的内存来保存其数据,您就可以将指针转换为任何序数类型:

void *ptr_shared;                        
mem.Attach(&ptr_shared);
char* someData = reinterpret_cast<char*>(ptr_shared);
*someData = 'f'; 
++someData;
int* otherData = reinterpret_cast<int*>(someData);
*otherData = 11;

然而,转换为动态类型std::vector会很糟糕。


推荐阅读