QQ登录

只需一步,快速开始

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 786|回复: 6

为什么还是总有段错误?(别嫌我烦啊)

[复制链接]
发表于 2004-6-11 16:29:39 | 显示全部楼层 |阅读模式
其实还是昨天的那个,很简单,在tc下已经通过了,执行也正常,可是在linux下编译通过,执行后基本正常,但最后最后显示段错误,注意最后,如下:
[code:1]
please you put the data:1
     The 1 dian address is:  1074230010  ,the data is 1 ,the lchild is  0  ,the
rchild is  0
please you put the data:2
     The 2 dian address is:  1074230030  ,the data is 2 ,the lchild is  0  ,the
rchild is  0
please you put the data:3
     The 3 dian address is:  1074230050  ,the data is 3 ,the lchild is  0  ,the
rchild is  0
please you put the data:0
please you put the data:4
     The 5 dian address is:  1074230070  ,the data is 4 ,the lchild is  0  ,the
rchild is  0
please you put the data:0
please you put the data:0
please you put the data:5
     The 8 dian address is:  1074230110  ,the data is 5 ,the lchild is  0  ,the
rchild is  0
please you put the data:0
please you put the data:0
please you put the data:6
     The 11 dian address is:  1074230130  ,the data is 6 ,the lchild is  0  ,the
  rchild is  0
please you put the data:0
please you put the data:7
     The 13 dian address is:  1074230150  ,the data is 7 ,the lchild is  0  ,the
  rchild is  0
please you put the data:8
     The 14 dian address is:  1074230170  ,the data is 8 ,the lchild is  0  ,the
  rchild is  0
please you put the data:0
please you put the data:0
please you put the data:9
     The 17 dian address is:  1074230210  ,the data is 9 ,the lchild is  0  ,the
  rchild is  0
please you put the data:0
please you put the data:0
the jiedian adress is 1074230010,data is 1, lchild is 1074230030,rchild is 10742
30130
the jiedian adress is 1074230030,data is 2, lchild is 1074230050,rchild is 1074
230110
the jiedian adress is 1074230050,data is 3, lchild is 0,rchild is 1074230070
the jiedian adress is 1074230070,data is 4, lchild is 0,rchild is 0
the jiedian adress is 1074230110,data is 5, lchild is 0,rchild is 0
the jiedian adress is 1074230130,data is 6, lchild is 0,rchild is 1074230150
the jiedian adress is 1074230150,data is 7, lchild is 1074230170,rchild is 1074
230210
the jiedian adress is 1074230170,data is 8, lchild is 0,rchild is 0
the jiedian adress is 1074230210,data is 9, lchild is 0,rchild is 0
段错误
[/code:1]
到底为什么哪?????
[code:1]
#include <malloc.h>
#include <stdio.h>
typedef struct jied{
  struct jied *right;
  struct jied *left;
  int data;
}Tree;
typedef Tree *pint;
void creat(pint *t,int *num)
{
  int dat;
  pint x;
  *num=*num+1;
  printf("please you put the data:");
  scanf("%d",&dat);
  if (dat==0) return;
  x=(pint)malloc(sizeof(Tree));
  if (!x) printf("malloc error!");
  x->data=dat;
  x->left=0;
  x->right=0;
  *t=x;
  printf("     The %d dian address is:  %o  ,the data is %d ,the lchild is  %o  ,the  rchild is  %o\n",*num,x,x->data,x->left,x->right);
  creat(&x->left,num);   /* lchild */
  creat(&x->right,num);   /* rchild */
  return;
}
void vis_a(pint t)
{
  if (!t) return;
  if (t->data==0) return;
  printf("the jiedian adress is %o,data is %d, lchild is %o,rchild is %o\n ",t,t->data,t->left,t->right);
  vis_a(t->left);
  vis_a(t->right);
  return;
}
void main()
{
  pint head;
  int *num;
  *num=0;
  creat(&head,num);
  vis_a(head);
}
[/code:1]
发表于 2004-6-11 17:41:38 | 显示全部楼层
dat是0就return了,所以那个head实际还没分配内存。
回复

使用道具 举报

发表于 2004-6-11 18:01:24 | 显示全部楼层
这是我改好的,具体改了哪些,你自己看吧
我就不说明了,呵呵!

另外楼主只申请内存,而不释放内存是极其不负责的!!!!!!
还有楼主写程序的时候一要注意赋初值, 二要注意检测指针是否有效。
否则,呵呵,动不动就给你来segment faults。

[code:1]
#include <malloc.h>
#include <stdio.h>

typedef struct node{
  struct node *right;
  struct node *left;
  int          data;
}Tree;

typedef Tree *pint;

void creat(pint *t,int *num)
{
  int dat;
  pint x;
  
  if (!t || !num)
     return ;

  (*num)++;
  
  printf("please you put the data:");
  scanf("%d",&dat);
  
  if (dat == 0)
      return;

  x = (pint)malloc(sizeof(Tree));
  if (!x)
     printf("malloc error!");
     
  x->data  = dat;
  x->left  = NULL;
  x->right = NULL;
  *t=x;
  
  printf("\tThe node %d address is: 0x%x, the data is %d, the lchild is 0x%x, the rchild is 0x%x\n", *num, x, x->data, x->left, x->right);
  
  creat(&x->left,num);   /* lchild */
  creat(&x->right,num);   /* rchild */
  
  return;
}


void vis_a(pint t)
{
  if (!t || t->data == 0)
     return;
  
  printf("the node adress is 0x%x,data is %d, lchild is 0x%x,rchild is 0x%x\n ",t,t->data,t->left,t->right);
  
  vis_a(t->left);
  vis_a(t->right);
  
  return;
}

int main()
{
  pint head = NULL;
  int  num  = 0;
  
  creat(&head,&num);
  
  vis_a(head);
  
  return 0;
}
[/code:1]
回复

使用道具 举报

 楼主| 发表于 2004-6-11 18:53:49 | 显示全部楼层
谢谢大姐(?)了
我按照上面的改了main函数中的
  int *num;
  *num=0;
great(&head,&num);

int num=0;
great(&head,&num);
段错误就没有了,
最主要的毛病是申请了指针,但是指针里的内容还是过去的地址,而这个地址的内存单元可能存别的那,结果我一句*num=0把不属于这个程序的内存给占用了.......,是这样码?
其实我没有释放内存的习惯 ,以后我要记住了。
很感谢大家的帮忙,这次也让我对指针使用规范更了解一些了。
回复

使用道具 举报

发表于 2004-6-11 19:28:26 | 显示全部楼层
多来,不来我就失业了   
回复

使用道具 举报

 楼主| 发表于 2004-6-11 19:40:21 | 显示全部楼层
好的  多来 多来
回复

使用道具 举报

发表于 2004-6-11 19:57:27 | 显示全部楼层
[quote:a6226218ab="nextw3"]谢谢大姐(?)了
我按照上面的改了main函数中的
  int *num;
  *num=0;
great(&head,&num);

int num=0;
great(&head,&num);
段错误就没有了,
最主要的毛病是申请了指针,但是指针里的内容还是过去的地址,而这个地址的内存单元可能存别的那,结果我一句*num=0把不属于这个程序的内存给占用了.......,是这样码?
其实我没有释放内存的习惯 ,以后我要记住了。
很感谢大家的帮忙,这次也让我对指针使用规范更了解一些了。[/quote]
单纯只改这一点是不行的
不信你一开始就输入一个0试试
呵呵,又会给你一个段错误~~
什么原因, 自己查查
其实我改了你的代码的很多地方
只是想告诉你写代码要规范, 要清晰
否则时间稍长的自己再来这个程序就不知道这个程序是干嘛的了
这还只是小程序, 看懂这些代码不用花多少时间, 即使代码写的一团糟.
但是对于上千行,上万行的甚至几百万行的程序了
我想那就不知道你这些代码是在干嘛了.
呵呵............自己体会
回复

使用道具 举报

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

本版积分规则

GMT+8, 2024-11-8 05:57 , Processed in 0.038333 second(s), 16 queries .

© 2021 Powered by Discuz! X3.5.

快速回复 返回顶部 返回列表