使用 void 指针:void **ptr.. 如何修改共享内存的值?
Using void pointers: void **ptr... how to modify the value of a shared memory?
我正在尝试使用一个函数:
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
这样的强制转换为动态类型会以糟糕的方式结束。
相关文章:
- 将成员变量添加到共享库中的类中,不会破坏二进制兼容性吗
- 为什么随机数生成器不在void函数中随机化数字,而在main函数中随机化
- 在c++类上调用void函数
- 为什么野牛仍在使用"int yylex(void)",却找不到"int yylex(YYS
- 是否可以通过C++扩展强制多个python进程共享同一内存
- 在派生函数中指定void*参数
- 在cuda线程之间共享大量常量数据
- C++为什么尽管我调用了void函数,它却不起作用
- 如何从void函数输出字符串
- 我应该使用什么来代替void作为变体中的替代类型之一
- 奇怪的结构&GCC&clang(void*返回类型)
- Arduino:for/while/if在void setup()或void loop()之前?——错误:之前需要不合格
- 为什么这个函数将"const char*"转换为"void* const"而不是"const void*"
- 如何从具有移动语义的类对象中生成共享指针
- 在c代码之间共享数据的最佳方式
- 在两个类中共享相同的函数调用,并在不需要时避免空实例化
- 引用一个已擦除类型(void*)的指针
- 使用 void 指针:void **ptr.. 如何修改共享内存的值?
- 我如何在void*和boost共享ptr之间切换
- 共享库从 void * "invalid conversion" 到 double(*) (int*) 时出错?