Chinaunix

标题: 消息队列发送含指针的结构变量问题,请教! [打印本页]

作者: nari396    时间: 2008-01-06 23:07
标题: 消息队列发送含指针的结构变量问题,请教!
定义了一个结构
struct tag{
        int i;
        int *pi;
}
数据处理部分:
int i,*ii;
i=1234;
ii = new int[1];
memcpy(ii,&i,sizeof(int));
struct tag tmptag;
tmptag.pi = ii;
发送消息:
mq_send(test_mq_id,(char *)&tmptag,sizeof(tag),SIGRTMAX;
接受消息:
struct tag tagvalue;
mq_receive(test_mq_id,(char *)&tagvalue,100,&priop);
打印tagvalue.pi看到内存地址.可是*(tagvalue.pi)却是0,不是想要的1234
这是为什么啊?盼指教
作者: 放驴娃    时间: 2008-01-07 02:13
又是一个错误的问题。
不知道楼主小时候有没有学过一篇课文叫做《刻舟求剑》的?
作者: lyyx    时间: 2008-01-07 05:07
提示: 作者被禁止或删除 内容自动屏蔽
作者: nari396    时间: 2008-01-07 07:51
3楼,我释放了内存,也是这样的结果.
2楼,还请告诉我该怎么做,谢谢
作者: zhhui2000    时间: 2008-01-07 08:37
发/收是在一个进程不?

若不是的法,两过的.pi指向的地址的内容肯定不一样不。

BTW:
        二楼的“刻舟求剑”真是形象.

[ 本帖最后由 zhhui2000 于 2008-1-7 08:40 编辑 ]
作者: alazer    时间: 2008-01-07 08:50
刻舟求剑真形象啊!
你接收线程中的struct tag tagvalue变量,tagvalue的指针*pi难道不需要分配内存?!

[ 本帖最后由 alazer 于 2008-1-7 08:51 编辑 ]
作者: nari396    时间: 2008-01-07 09:09
我分配了内存了
接受消息:
struct tag tagvalue;
mq_receive(test_mq_id,(char *)&tagvalue,100,&priop);
int *tmp;
tmp = new int[1];
memcpy(tmp,tagvalue.pi,sizeof(int));
当printf("value=%d\n",*tmp);结果仍然是0
哪里有问题啊
作者: alazer    时间: 2008-01-07 09:17
原帖由 nari396 于 2008-1-7 09:09 发表
我分配了内存了
接受消息:
struct tag tagvalue;
mq_receive(test_mq_id,(char *)&tagvalue,100,&priop);
int *tmp;
tmp = new int[1];
memcpy(tmp,tagvalue.pi,sizeof(int));
当printf("value=%d\n",*t ...



你这样写,看一下呢:
struct tag tagvalue;
//int *tmp;
//tmp = new int[1];
tagvalue.pi = new int[1];
mq_receive(test_mq_id,(char *)&tagvalue,100,&priop);
printf......略
作者: nari396    时间: 2008-01-07 09:36
效果一样的,
printf以后 *(tagvalue.pi)的数据仍然是0
5555,我在ubuntu702上用g++编译的.
能不能帮我编译看看
作者: ljok30    时间: 2008-01-07 09:42
5楼的正解,关键看你在发送前的那个指针有没有释放,如果释放了,肯定是不行的!在有就是如果不是一个进程,那自然也是不行的!
给个建议,看一下接收后的指针的内容是否和发送的指针的内容一样(这里指指针里存放的内存地址)!
作者: nari396    时间: 2008-01-07 09:48
我的不是同一个进程,为什么不是同一个进程就不行呢
作者: nari396    时间: 2008-01-07 09:49
我看了发送和接受的数据地址是一样的,但是接受后取值就是0
作者: alazer    时间: 2008-01-07 09:58
应该是mq_send用法的问题
在mq_send的时候,发送的数据长度sizeof(tag) = 4+4即 sizeof(int)和sizeof(int*),而tag中的指针pi指向的数据根本没有发送
作者: ljok30    时间: 2008-01-07 10:00
不一样的进程有自己的堆栈,当然就不一样了!
作者: alazer    时间: 2008-01-07 10:02
原帖由 nari396 于 2008-1-7 09:49 发表
我看了发送和接受的数据地址是一样的,但是接受后取值就是0

呵呵,是啊,你是把pi指针本身的地址发送过去了,而不是pi指针指向的内容
然后你在接收线程想用这个地址pi再引用数据
如果发送线程没有delete那个内存,会读出来数据吧
哦,对了,你好像是不同进程的,你把pi的地址传过去,每个进程堆栈不一样,没有数据就正常了,还好没dump了

[ 本帖最后由 alazer 于 2008-1-7 10:07 编辑 ]
作者: xxmv99    时间: 2008-01-07 10:07
我借楼问一下:
struct tag{
        int i;
        int *pi;
}

struct tag tmptag;//这样就已经申请分配了pi的空间?

结构中的指针的内在分配.

还有new int[]是什么语句?
作者: nari396    时间: 2008-01-07 10:07
我在发送时没有delete内存(如果delete了话,对接受的地址取值会core)
我发送时地址0x0804a008,值是1234
接受也是这个地址,值是0
能不能帮我看一下具体程序
作者: ljok30    时间: 2008-01-07 10:09
alazer 的说法不是很准确,“而tag中的指针pi指向的数据根本没有发送 ”,如果是一个进程,堆内存的地址只要你不手动释放,我只需要把tag中的指针pi发过去就可以了,没有必要去发它指向的数据!
作者: alazer    时间: 2008-01-07 10:16
原帖由 ljok30 于 2008-1-7 10:09 发表
alazer 的说法不是很准确,“而tag中的指针pi指向的数据根本没有发送 ”,如果是一个进程,堆内存的地址只要你不手动释放,我只需要把tag中的指针pi发过去就可以了,没有必要去发它指向的数据!

谢谢纠正.
如果楼主的程序是在一个进程中,如你说述,只需要传送该地址就可以了,接收线程就可以直接引用即可

既然是不同进程,我看楼主的这样传送不可行,应该把struct tag中pi的内容单独传输
作者: nari396    时间: 2008-01-07 10:19
我晕,只能把指针替换掉了
作者: okmmno1    时间: 2008-01-07 15:59
原帖由 nari396 于 2008-1-7 10:19 发表
我晕,只能把指针替换掉了

楼主好可爱 呵呵
作者: houhulou    时间: 2009-07-06 18:44
标题: 回复 #21 okmmno1 的帖子
学习了 不同进程的堆地址还不一样吗?




欢迎光临 Chinaunix (http://bbs.chinaunix.net/) Powered by Discuz! X3.2