共享内存问题!!!

chengqian0929 2009-12-24 10:30:27
我在共享内存上要创建链表, 而节点里有一个成员也需要动态地开辟内存(因为该成员的大小不确定), 问我的共享内存如何实现?
...全文
179 16 打赏 收藏 转发到动态 举报
写回复
用AI写文章
16 条回复
切换为时间正序
请发表友善的回复…
发表回复
aozhi 2009-12-25
  • 打赏
  • 举报
回复
你的链表的内容应该是通过文件读入的吧?
如果是这样的话,可以通过下面的方法,取得文件的长度。
fhInput=_open(inputFile,O_RDONLY);
fileLength=filelength(fhInput);
然后申请读入缓冲区
inputBuffer=(char*)malloc(fileLength);
再根据自定义链表的结构算出文件记录的件数和需要共享内存的大小。
...
最后再使用shmget取得共享内存。

如果再程序运行的时候,共享内存的大小还要发生变化。确实没有什么好主意了。
要么一开始就分配一个足够大的,要么就重新分配。
cattycat 2009-12-25
  • 打赏
  • 举报
回复
如果不想用placenew,就分配节点数组吧,这个比较简单。
cattycat 2009-12-25
  • 打赏
  • 举报
回复
进程间共享的话,分配一个大的内存,如何在这个内存中创建链表的节点,就可以让其他进程访问了。
在指定内存创建对象可以用place new技术,把链表节点创建到你全局分配的内存中去。
wolffan3150 2009-12-25
  • 打赏
  • 举报
回复
路过
wafukfge 2009-12-25
  • 打赏
  • 举报
回复
全局变量 就可以实现共享
mymtom 2009-12-25
  • 打赏
  • 举报
回复
需要自己管理内存。
自己实现node_alloc,和node_free函数。
其他的操作和普通的链表一样。

一下是个简单的示例, 只能分配固定大小的node, 不能动态扩展,而且要求进程将共享内存映射到相同的地址。

#define MAX_NODE_NO 1024
struct node {
char data[60];
struct *next;
};
struct memchunk {
char flag[MAX_NODE_NUM];
struct node node_buf[MAX_NODE_NUM];
}

memchunk_init(void)
{
chunk = (struct memchunk *)shmat(sizeof(struct mmechunk));
memset(chunk->flag, 0, sizeof(chunk->flag));
}

struct node *
node_alloc()
{
int i;
for (i = 0; i < MAX_NODE_NUM; i++) {
if (0 == chunk->flag[i]) {
chunk->flag[i] = 1;
return &chunk->node_buf[i];
}
}
return 0;
}

void
node_free(struct node *p_node)
{
int index;

i = p_node - chunk->node_buf;
chunk->flag[i] = 0;
}

macrojj 2009-12-24
  • 打赏
  • 举报
回复
链表的创建你来做啊

节点的创建 链表来做啊。
fx397993401 2009-12-24
  • 打赏
  • 举报
回复
定义为全局变量 就可以实现共享
chengqian0929 2009-12-24
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 cdbdyx 的回复:]
怎么老是你!
how old are you!

开辟一大块空间(内存池),每个连表节点都从这个空间里面分配,然后共享这个大空间
[/Quote]

呵呵!我是一位新手, 现在做项目遇到问题,可是身边又没有人指导,所以只能在这里请教各位高手了。按着6楼的方法能使节点顺序存储,但是我困惑的是:节点里有个成员需要动态地开辟内存?能用什么方法,使其开辟的子空间能保证在这个共享内存上?
chengqian0929 2009-12-24
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 cdbdyx 的回复:]
怎么老是你!
how old are you!

开辟一大块空间(内存池),每个连表节点都从这个空间里面分配,然后共享这个大空间
[/Quote]

呵呵!不好意思,我是一位新手,在做项目期间遇到问题了。没有人给指导,只能在这里请教高手了。
充电宝111 2009-12-24
  • 打赏
  • 举报
回复
怎么老是你!
how old are you!

开辟一大块空间(内存池),每个连表节点都从这个空间里面分配,然后共享这个大空间
james_hw 2009-12-24
  • 打赏
  • 举报
回复
[Quote=引用楼主 chengqian0929 的回复:]
我在共享内存上要创建链表, 而节点里有一个成员也需要动态地开辟内存(因为该成员的大小不确定), 问我的共享内存如何实现?
[/Quote]

如果在进程间共享内存,那就不能用malloc和free来动态使用内存了,你要做好内存管理,不过我上述说的方法可以保证节点里成员之间的地址是连续的
james_hw 2009-12-24
  • 打赏
  • 举报
回复
C99之前,节点里的成员(需要动态申请内存的)声明成t[0],C99之后,声明成t[],这样做的好处就是你create节点时,只要malloc一次就够了,而且delete节点,free一次就够了。
pombo 2009-12-24
  • 打赏
  • 举报
回复
全局变量
somesky 2009-12-24
  • 打赏
  • 举报
回复
使用外部静态变量
extern LinkList l;
jack_wq 2009-12-24
  • 打赏
  • 举报
回复
全局变量链表实现,没有问题的

69,373

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧