使用void指针:void ** ptr ...如何修改共享内存的值?

时间:2019-07-16 02:27:35

标签: c++ pointers posix

我正在尝试使用一个函数:

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(带有系统v)的进程之间使用共享内存的包装器。

所以我以这种方式调用Attach():

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

我目前的理解:

  • **无效地址是指向指针(* address)的指针。
  • * address是shmat()指向共享内存块的指针。
  • 因此,如果我想为该内存块分配一个值(当我创建Mem对象时,得到的键是单个int的块),我想更改* ptr_shared指向的值。 / li>

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

*ptr_shared = 42;

然后我收到了SIGSEGV错误。

怎么了?是我对指针的理解还是我试图使用系统v的问题?

编辑:遵循Miles的评论(和John的评论)。如果我想改为使用Attach返回指向共享内存段的指针...我将如何管理其类型?创建共享内存段时,我使用的是int的大小。所以...这意味着我绝对必须只将int分配给该段,因此返回的指针类型必须为int?但是,可能会创建其他内存段来包含字符...因此,在这种情况下,如何管理Attach()中依赖于内存段大小的未知类型的返回指针?

我来自Python背景,所以我们不会做太多类型的事情。...

1 个答案:

答案 0 :(得分:0)

  

如果我想改为附加以返回指向共享内存段的指针...我将如何管理其类型?创建共享内存段时,我使用的是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)会很糟糕。