gnu支持长度为0的数组,一般用来表示结构体或者类的最后一个数据成员,这样的数据成员不占任何空间并指向所在结构体或者类对象的下一个字节.下面示例代码显示了通过共享内存管理两块数据空间,每个数据由一个DataMgr来管理,而DataMgr中的data这个成员正式一个长度为0的数组,他指向了数据空间的首地址。
#include<iostream>
#include<sys/shm.h>
using namespace std;
struct Data{
uint32_t mgridx;
uint32_t width;
};
struct DataMgr{
uint32_t maxlen;
uint32_t curlen;
Data data[0];长度为0的数组不占任何空间,他指向所属DataMgr对象的下一个字节
};
int main()
{
DataMgr* pDataMgrs[2];
uint32_t mgrnum=2;
uint32_t datanum=3;
uint32_t totalmemlen=(sizeof(DataMgr)+sizeof(Data)*datanum)*mgrnum;sizeof(DataMgr)=8,因为长度为0的数组不占任何空间
cout<<"totalmemlen="<<totalmemlen<<endl;//分配64字节的共享内存
uint32_t shmkey=20150114;
int shmid=shmget(shmkey,totalmemlen, 0666|IPC_CREAT);
uint32_t* pbuf=(uint32_t*)shmat(shmid,NULL,0);
在共享内存上构建两个mgr
pDataMgrs[0]=(DataMgr*)(pbuf);
pDataMgrs[1]=(DataMgr*)((uint8_t*)pbuf+(sizeof(DataMgr)+sizeof(Data)*datanum));
for(uint32_t i=0;i<2;i++)/为共享内存赋值
{
pDataMgrs[i]->maxlen=datanum;
pDataMgrs[i]->curlen=datanum;
for(uint32_t j=0;j<pDataMgrs[i]->maxlen;j++)
{
pDataMgrs[i]->data[j].mgridx=i+1;
pDataMgrs[i]->data[j].width=(i+1)*100;
}
}
for(uint32_t i=0;i<2;i++)打印赋值
{
for(uint32_t j=0;j<pDataMgrs[i]->maxlen;j++)
{
cout<<pDataMgrs[i]->data[j].mgridx<<" "<<pDataMgrs[i]->data[j].width<<endl;;
}
}
for(uint32_t i=0;i<totalmemlen/4;i++)每4个字节打印下共享内存
{
cout<<"mem addr is:"<<pbuf+i<<",data is "<<*(pbuf+i)<<endl;
}
}
执行的结果为: