免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
12下一页
最近访问板块 发新帖
查看: 3640 | 回复: 11
打印 上一主题 下一主题

[函数] 谁来帮忙看一下,队列入队函数出错的问题: [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2003-05-07 22:55 |只看该作者 |倒序浏览
以下入队函数在运行时只能打印出"Debug1"后就core dump了,不继续打印"Debug2"。
谁能帮忙看一下,有什么问题吗?

/
  1. * 入队函数 */
  2. void EnQueue(MsgQueue *Q,MsgPkt e)
  3. {
  4.         MsgNode * p=NULL;

  5.         p = (MsgNode *)malloc(sizeof(MsgNode));
  6.         if(p != NULL){
  7.                 printf("Debug1\n");
  8.                 p->;pnext = NULL;
  9.                 printf("Debug2\n");
  10.                 p->;msgpkt = e;
  11.         }
  12.         if( (*Q).phead == NULL)
  13.                 (*Q).ptail = (*Q).phead = p;
  14.         else
  15.                 (*Q).ptail = (*Q).ptail->;pnext = p;
  16. }
  17. /*--------------------------------------------------------------*/

  18. 结构定义:
  19. typedef struct{
  20.         char msg1[20];               
  21.         char msg2[20];               
  22. }MsgPkt;

  23. typedef struct MsgNode{
  24.         MsgPkt                        msgpkt;
  25.         struct MsgNode        * pnext;
  26. }MsgNode;


  27. typedef struct{
  28.         MsgNode * phead;
  29.         MsgNode * ptail;
  30. }MsgQueue;
复制代码

论坛徽章:
0
2 [报告]
发表于 2003-05-08 08:52 |只看该作者

谁来帮忙看一下,队列入队函数出错的问题:

将定义

  1. typedef struct MsgNode{
  2.    MsgPkt         msgpkt;
  3.    struct MsgNode   * pnext;
  4. }MsgNode;
复制代码

改成

  1. typedef struct MsgNode{
  2.    MsgPkt         *msgpkt;
  3.    struct MsgNode   * pnext;
  4. }MsgNode;
复制代码

试试。

论坛徽章:
0
3 [报告]
发表于 2003-05-09 13:15 |只看该作者

谁来帮忙看一下,队列入队函数出错的问题:

不行,不能改成指针,该结构是要用于socket发送的数据包, 数据包在传送时不能使用指针

论坛徽章:
0
4 [报告]
发表于 2003-05-09 13:23 |只看该作者

谁来帮忙看一下,队列入队函数出错的问题:

p->;msgpkt = e;
改成
memcpy(p->;msgpkt , e, sizeof(MsgNode));

论坛徽章:
0
5 [报告]
发表于 2003-05-09 14:43 |只看该作者

谁来帮忙看一下,队列入队函数出错的问题:

这段代码应该没问题的,看看是不是别的地方引起core dump

  1.    MsgNode * p=NULL;

  2.    p = (MsgNode *)malloc(sizeof(MsgNode));
  3.    if(p != NULL){
  4.       printf("Debug1\n");
  5.       p->;pnext = NULL;
  6.       printf("Debug2\n");
  7.       p->;msgpkt = e;
  8.    }
复制代码



一个例子:

  1. #include <stdio.h>;
  2. #include <stdlib.h>;
  3. #include <sys/errno.h>;

  4. typedef struct{
  5.    char msg1[20];      
  6.    char msg2[20];      
  7. } MsgPkt;

  8. typedef struct MsgNode{
  9.    MsgPkt                 msgpkt;
  10.    struct MsgNode   * pnext;
  11. } MsgNode;

  12. typedef struct{
  13.    MsgNode * phead;
  14.    MsgNode * ptail;
  15. } MsgQueue;

  16. void EnQueue(MsgQueue *Q, MsgPkt e)
  17. {
  18.     MsgNode *p = NULL;
  19.    
  20.     p = (MsgNode *)malloc(sizeof(MsgNode));
  21.     if (NULL == p)
  22.     {
  23.             fprintf(stderr, "malloc() error: [%s]\n", strerror(errno));
  24.             exit(-1);
  25.     }
  26.    
  27.     p->;pnext = NULL;
  28.     p->;msgpkt = e;  
  29.    
  30.     if (NULL == Q->;phead)
  31.     {
  32.             /* 队列第一个元素 */
  33.                Q->;ptail = p;
  34.                Q->;phead = p;
  35.     }
  36.     else
  37.     {
  38.                Q->;ptail->;pnext = p;
  39.                Q->;ptail = p;                
  40.         }
  41. }

  42. int main(void)
  43. {
  44.         MsgQueue Q;
  45.         MsgNode *pNode;
  46.         MsgNode *ptmpNode;
  47.         MsgPkt         pkg1;
  48.         MsgPkt         pkg2;
  49.         int n;
  50.        
  51.         memset(pkg1.msg1, 0x00, sizeof(pkg1.msg1));
  52.         memset(pkg1.msg2, 0x00, sizeof(pkg1.msg2));       
  53.         strcpy(pkg1.msg1, "abc");
  54.         strcpy(pkg1.msg2, "123");
  55.        
  56.         memset(pkg2.msg1, 0x00, sizeof(pkg2.msg1));
  57.         memset(pkg2.msg2, 0x00, sizeof(pkg2.msg2));       
  58.         strcpy(pkg2.msg1, "def");
  59.         strcpy(pkg2.msg2, "456");
  60.        
  61.         Q.phead = NULL;
  62.         Q.ptail = NULL;
  63.        
  64.         EnQueue(&Q, pkg1);
  65.         EnQueue(&Q, pkg2);
  66.        
  67.         pNode = Q.phead;
  68.         n = 0;
  69.         while (pNode != NULL)
  70.         {
  71.                 n++;
  72.                 fprintf(stderr, "package %d: %s, %s\n", n, pNode->;msgpkt.msg1, pNode->;msgpkt.msg2);
  73.                 ptmpNode = pNode->;pnext;
  74.                 free(pNode);
  75.                 pNode = ptmpNode;
  76.         }

  77.         return(0);
  78. }               
复制代码

运行结果:
package 1: abc, 123
package 2: def, 456

论坛徽章:
0
6 [报告]
发表于 2003-05-09 17:55 |只看该作者

谁来帮忙看一下,队列入队函数出错的问题:

使用gdb等调试一下看不就知道了
多动手调试
而不是在这分析代码

论坛徽章:
0
7 [报告]
发表于 2003-05-10 22:32 |只看该作者

谁来帮忙看一下,队列入队函数出错的问题:

调试结果:

gdb) step   
607             p = (MsgNode *)malloc(sizeof(MsgNode));
(gdb) step
608             if(p != NULL){
(gdb) display p
2: p = (struct MsgNode *) 0x262f8
(gdb) display p->;pnext
4: p->;pnext = (struct MsgNode *) Error accessing memory address 0x26730: Bad address.
Disabling display 4 to avoid infinite recursion.
(gdb) step
609                     printf("Debug1\n";
3: p = (struct MsgNode *) 0x262f8
2: p = (struct MsgNode *) 0x262f8
(gdb)
Debug1
610                     (*p).pnext = NULL;
3: p = (struct MsgNode *) 0x262f8
2: p = (struct MsgNode *) 0x262f8
(gdb) step

Program received signal SIGSEGV, Segmentation fault.
0x400000000000b9d4 in EnQueue (Q=0x80000001000015c8, e={

论坛徽章:
0
8 [报告]
发表于 2003-05-11 03:24 |只看该作者

谁来帮忙看一下,队列入队函数出错的问题:

找到原因了

原来是在makefile中加了一个64位编译参数"+DD64 ",因此导致内存访问错误,把该参数去掉后就不再
core dump了。


但为什么加了64位编译参数会产生这种现象呢? 怎样才能既不core dump又能生成64位的代码呢?

注:我的开发平台是HP9000 N系列服务器,操作系统为:HP-UX 11.0

论坛徽章:
0
9 [报告]
发表于 2003-05-11 11:00 |只看该作者

谁来帮忙看一下,队列入队函数出错的问题:

4: p->;pnext = (struct MsgNode *) Error accessing memory address 0x26730: Bad address.
Disabling display 4 to avoid infinite recursion.


你编译的机器是64位的还是32位的
32位的话指针是使用32 bit存储
64位的机器指针应该使用64 bit存

另外上面出错的这一句代码中没有写出来
你检查一下那部分代码是不是有把指针转换成int 或是把int转换成指针等操作
怀疑是指针转换问题

论坛徽章:
0
10 [报告]
发表于 2003-05-11 13:58 |只看该作者

谁来帮忙看一下,队列入队函数出错的问题:

我的机器是64位的,sizeof(int) == 8,
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP