用长度为0的数组管理共享内存

   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;
	}
	
}

执行的结果为:

 

 



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值