使用 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 中的进程(与系统 v)之间使用共享内存。

所以我这样调用 Attach():

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

我目前的理解:

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

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

*ptr_shared = 42;

然后我得到一个SIGSEGV错误。

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

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

我来自 Python 背景,所以我们不怎么做类型......

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

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

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这样的强制转换为动态类型会以糟糕的方式结束。