linux下编译成功但却执行却显示段错误的程序

时间:2023-01-20 08:36:01
#include <stdio.h>
#include <stdlib.h>
#include <malloc.h>
typedef char  ElemType; 
typedef struct BiTNode{
  ElemType data;
  struct BiTNode * lchild,*rchild; 
} BiTNode, *BiTree;
int PreCreateBiTree(BiTree T,FILE * fp);
int PreOrderTraverse(BiTree T);
int InOrderTraverse(BiTree T);
int PostOrderTraverse(BiTree T);
int LevelOrderTraverse(BiTree T);


int main(int argc, char** argv){
   FILE *fp=fopen("file","r");
   BiTree T;
   PreCreateBiTree(T,fp);
   PreOrderTraverse(T);
   InOrderTraverse(T);
   return 0;
}

int PreCreateBiTree(BiTree T, FILE* fp){
   ElemType ch=(ElemType)fgetc(fp);
   if(ch==' ') T=NULL;
   else {
       T=(BiTree)malloc(sizeof(BiTNode));
       T->data=ch;
       T->lchild=NULL;
       T->rchild=NULL;
       PreCreateBiTree(T->lchild,fp);
       PreCreateBiTree(T->rchild,fp);
   }
   return 1;
}

int PreOrderTraverse(BiTree T){
   if(T){
   printf("%c ",T->data);
   if(T->rchild) PreOrderTraverse(T->rchild);
   if(T->lchild) PreOrderTraverse(T->lchild);
   return 1;   
    }
   else return 0;
}
int InOrderTraverse(BiTree T){
   if(T){
        if(T->lchild) InOrderTraverse(T->lchild);
        printf("%c ",T->data);
        if(T->rchild) InOrderTraverse(T->rchild);
        return 1;
        }
   else return 0;
}

 int PostOrderTraverse(BiTree T){
   if(T){
        if(T->lchild) PostOrderTraverse(T->lchild);
        
        if(T->rchild) PostOrderTraverse(T->rchild);
        printf("%c ",T->data);
        return 1;
        }
   else return 0;
}



------------------------------------------------------------------
gdb调试后如此显示

Program received signal SIGSEGV, Segmentation fault.
_int_malloc (av=0x7ffff7dd71c0, bytes=24) at malloc.c:4411
4411 malloc.c: 没有那个文件或目录.
in malloc.c
(gdb) 

5 个解决方案

#1


#include <stdio.h>
#include <stdlib.h>
只需这两个头文件就行了啊

#2


去了malloc.h  也是显示这个结果

#3


vc2010显示如下
1>f:\c_projects\n1\mp_solution\mytestp\ex5.c(19): warning C4700: uninitialized local variable 'T' used

我个人认为:
T在使用前未初始化,这个不是语法错误,但是你只定义了一个指针变量T,却没有指向一个地址,你让TA情何以堪,所以,使用前先为T开辟个内存空间吧!
在为T开辟空间前,你就在使用T了:PreCreateBiTree(T,fp);    //T作为实参被使用
如果我想你采用这种形式应该没问题:T=PreCreateBiTree(fp);    //是否有为T指定空间之意?

#4


linux gcc 是吧?
gcc编译的时候加上 -g
gdb到程序崩了之后,输入bt命令,然后就会有神奇的事情发生了。

#5


段错误可能就是分配内存引起的,GDB调试下

#1


#include <stdio.h>
#include <stdlib.h>
只需这两个头文件就行了啊

#2


去了malloc.h  也是显示这个结果

#3


vc2010显示如下
1>f:\c_projects\n1\mp_solution\mytestp\ex5.c(19): warning C4700: uninitialized local variable 'T' used

我个人认为:
T在使用前未初始化,这个不是语法错误,但是你只定义了一个指针变量T,却没有指向一个地址,你让TA情何以堪,所以,使用前先为T开辟个内存空间吧!
在为T开辟空间前,你就在使用T了:PreCreateBiTree(T,fp);    //T作为实参被使用
如果我想你采用这种形式应该没问题:T=PreCreateBiTree(fp);    //是否有为T指定空间之意?

#4


linux gcc 是吧?
gcc编译的时候加上 -g
gdb到程序崩了之后,输入bt命令,然后就会有神奇的事情发生了。

#5


段错误可能就是分配内存引起的,GDB调试下