C++ 如何在特定地址声明结构?

C++ 如何在特定地址声明结构?,c++,linux,shared-memory,C++,Linux,Shared Memory,我有两个应用程序使用共享内存段将数据从写入进程传递到读取进程。在共享内存段的顶部,我想声明一个标头结构,以包含常规段数据,如缓冲区计数值、读/写偏移量、pthread mutex/条件变量等。标头结构不包含任何指针。然后,段的其余部分用于在两个进程之间传递的实际数据 由于共享内存段连接到进程,我确信该段确实对进程有效/可访问。简单地将基段指针强制转换为头结构类型的指针是很容易的,这对于常规数据类型(如ints等)非常有效,但对于结构中的非整数数据类型(如pthread mutex/conditi

我有两个应用程序使用共享内存段将数据从写入进程传递到读取进程。在共享内存段的顶部,我想声明一个标头结构,以包含常规段数据,如缓冲区计数值、读/写偏移量、pthread mutex/条件变量等。标头结构不包含任何指针。然后,段的其余部分用于在两个进程之间传递的实际数据

由于共享内存段连接到进程,我确信该段确实对进程有效/可访问。简单地将基段指针强制转换为头结构类型的指针是很容易的,这对于常规数据类型(如ints等)非常有效,但对于结构中的非整数数据类型(如pthread mutex/condition变量)不起作用,因为它们实际上尚未声明和分配

那么,如何声明和分配头结构,以从我已经分配的共享内存段的特定地址开始

以下各项似乎不起作用:

SmHeader header = *((SmHeader *)m_pBaseAddress);

m_pHeader = &header;
其中SmHeader是my header结构的typedef,m_pBaseAddress是连接的共享内存段的基址

谢谢,
-安德烈斯

我认为它不起作用,因为你创造它的方式:

// this creates a copy of the SmHeader struct, on the stack
SmHeader header = *((SmHeader *)m_pBaseAddress);

// this sets m_pHeader to address of the local variable, not
// m_pBaseAddress
m_pHeader = &header;
请尝试以下方法:

m_pHeader = (SmHeader *) m_pBaseAddress;

我认为它不起作用,因为您创建它的方式:

// this creates a copy of the SmHeader struct, on the stack
SmHeader header = *((SmHeader *)m_pBaseAddress);

// this sets m_pHeader to address of the local variable, not
// m_pBaseAddress
m_pHeader = &header;
请尝试以下方法:

m_pHeader = (SmHeader *) m_pBaseAddress;

显示更多代码,包括
m_pHeader
的声明(可能还有包含它的
类)。也许您可以声明
smHeader&header=*(ShHeader*)m_pBaseAddress显示更多代码,包括
m_pHeader
的声明(可能还有包含它的
)。也许您可以声明
smHeader&header=*(ShHeader*)m_pBaseAddressSmHeader*
)告诉编译器“查看此内存并将其内容视为
SmHeader
结构”。然后使用
*
取消引用该指针,并将其内容复制到新创建的
header
变量,它是类型为
SmHeader
的本地堆栈变量。这当然不是您想要的。问题是pthread互斥锁工作不正常。我最初使用了与您相同的推理,认为pthread objs的实际空间显然是分配的,所以这样就可以了。但是由于互斥锁不工作(它是进程正确共享的),我想我一定没有正确分配完整的结构。谢谢你们的回复。您的建议正是我的建议,但似乎不起作用,因为它既不声明也不分配header结构。这对于结构中的int、char等很好,但是pthread变量不是通过定义指针来分配的。@AndresGonzalez我不知道“已分配”是什么意思。内存已经分配了,因为它是共享内存段的一部分。您正在“声明”指向它的指针。“pthread变量”到底出了什么问题(它们是什么类型的变量)?您的第一条语句实际上在堆栈上创建了结构吗?@AndresGonzalez哪个语句?你的第一句话就是。内部转换(将共享内存地址转换为
SmHeader*
)告诉编译器“查看此内存并将其内容视为
SmHeader
结构”。然后使用
*
取消引用该指针,并将其内容复制到新创建的
header
变量,它是类型为
SmHeader
的本地堆栈变量。这当然不是您想要的。问题是pthread互斥锁工作不正常。我最初使用了与您相同的推理,认为pthread objs的实际空间显然是分配的,所以这样就可以了。但是由于互斥锁不工作(它是进程正确共享的),我想我一定没有正确分配完整的结构。