免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 4023 | 回复: 4

[C] linux C编程创建消息队列 [复制链接]

论坛徽章:
0
发表于 2013-07-09 11:02 |显示全部楼层
看别人的代码,函数功能为创建消息队列
  1. typedef unsigned int U32

  2. typedef struct {
  3.     sem_t    sem;
  4.     pthread_mutex_t   mutex;
  5.     U32       u32MsgSize;   //消息大小
  6.     U32       u32MaxMsgs;  //消息队列中所能容纳的最多消息数
  7.    [color=Red] void       *msgs;   [/color] //消息指针
  8.     U32    u32HeaderIdx; //当前消息序号
  9.     U32     u23MsgNum;// the number of existing msgs in the message queue
  10. }MsgInfo_t;
复制代码
  1. S32 MsgQCreate(  U32 u32MsgSize, U32 u32MaxMsgNum )
  2. {
  3.     MsgInfo_t *mmsg = NULL;

  4.    [color=Red] mmsg = malloc(sizeof(MsgInfo_t)+u32MsgSize*u32MaxMsgNum);[/color]
  5.     if ( NULL== mmsg )
  6.     {
  7.         return FAIL;
  8.     }
  9.     memset( mmsg , 0 , sizeof(MsgInfo_t) );

  10.     mmsg->u32MsgSize = u32MsgSize;
  11.     mmsg->u32MaxMsgs = u32MaxMsgNum;
  12.     [color=Red]mmsg->msgs  = (void *)( mmsg+1 );[/color]
  13.     mmsg->u32HeaderIdx = 0;
  14.     mmsg->u23MsgNum = 0;

  15.     pthread_mutex_init( &mmsg->mutex , NULL );
  16.     sem_init( &mmsg->sem, 0, 0 );

  17.     return OK;
  18. }
复制代码
本人菜鸟,
1.我想请问这句代码
mmsg->msgs  = (void *)( mmsg+1 );
为什么msgs等于mmsg+1,
mmsg为指向结构体MsgInfo_t的指针,而msgs包含在结构体MsgInfo_t中,按定义,从mmsg开始的一段内存空间应该先保存sem,mutex,u32MsgSize,u32MaxMsgs,然后
才保存msgs指向的内容,可不应该加1啊,请指教

2.如果一个结构体里包含指针变量,我为该结构体申请内存空间,那结构体里的指针是不是需要初始化或申请内存空间呢?还是不用,因为在为结构体申请内存时已经完成了对结构体内指针的初始化?请指教

论坛徽章:
4
水瓶座
日期:2013-09-06 12:27:30摩羯座
日期:2013-09-28 14:07:46处女座
日期:2013-10-24 14:25:01酉鸡
日期:2014-04-07 11:54:15
发表于 2013-07-09 11:25 |显示全部楼层
+1不就跳过消息头定位到消息体了吗。

指针和指针指向的内存你得区分啊,这里很明显是直接分配一块内存,前面是头,后面是体。

论坛徽章:
0
发表于 2013-07-09 12:11 |显示全部楼层
你好,我是觉得它不应该只加1啊,消息头包括sem,mutex,u32MsgSize,u32MaxMsgs等变量,仅仅u32MsgSize和u32MaxMsgs就各占4个字节呀,至少应该加8才能跳过消息头到达消息体呀回复 2# linux_c_py_php


   

论坛徽章:
4
水瓶座
日期:2013-09-06 12:27:30摩羯座
日期:2013-09-28 14:07:46处女座
日期:2013-10-24 14:25:01酉鸡
日期:2014-04-07 11:54:15
发表于 2013-07-09 13:50 |显示全部楼层
指针+1是偏移指向类型宽度个字节的, 比如short *p; p+1是偏移sizeof(short)个字节. char *p;p+1才是偏移sizeof(char), 即1个字节.

论坛徽章:
0
发表于 2013-07-10 13:51 |显示全部楼层
我懂了,你讲的太精辟了,非常感谢!!回复 4# linux_c_py_php


   
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP