在C++中运行程序,为什么在编译时没有问题,但是回到程序的执行时,就会出现程序崩溃的情况???

这是一个二叉树的链表构造程序,而且程序能成功运行“前序,中序,后序”遍历,并且输出正确答案,一到“节点数的运算”,就会系统崩溃。
#include<iostream>
#include<map>
using namespace std;
typedef char DataType;
typedef struct Bitnode
{ DataType d;
struct Bitnode *lchild,*rchild;
}BitTree;
Bitnode *gen;//根节点
int sum;
int creat(Bitnode *p,int k)
{
Bitnode *q;
DataType x;
cin>>x;
if(x!='#')
{q=new Bitnode;
q->d=x;
q->lchild=NULL;
q->rchild=NULL;
if(k==1) p->lchild=q;
if(k==2) p->rchild=q;
creat(q,1);
creat(q,2);
}
return 0;
}
void creat_Binary_Tree()//构造二叉树链表结构
{
DataType x;
cin>>x;
if(x=='#') return;
gen=new Bitnode;
gen->d=x;
gen->lchild=NULL;
gen->rchild=NULL;
creat(gen,1);
creat(gen,2);
return;
}
int pretrav(Bitnode *gen)//前序遍历
{
if(gen!=NULL)
{
cout<<gen->d<<" ";
pretrav(gen->lchild);
pretrav(gen->rchild);
}
return 0;
}
int intrav(Bitnode *gen)//中序遍历
{
if(gen!=NULL)
{intrav(gen->lchild);
cout<<gen->d<<" ";
intrav(gen->rchild);
}
return 0;
}
int postrav(Bitnode *gen)//后序遍历
{
if(gen!=NULL)
{postrav(gen->lchild);
postrav(gen->rchild);
cout<<gen->d<<" ";
}
return 0;
}
void CountLeaf (Bitnode * T, int count)//节点总数的计算
{
if(T)
{
count=count+1;
sum=count;
}
CountLeaf( T->lchild, count);
CountLeaf( T->rchild, count);
}
int depthval;//深度计算
int depthLeft;
int depthRight;
int Depth (Bitnode * T )
{
if( !T ) depthval = 0;
else
{ depthLeft = Depth( T->lchild );
depthRight= Depth( T->rchild );
depthval = 1 + (depthLeft > depthRight ? depthLeft : depthRight);
}
return depthval;
}
int main(){
cout<<"请输入!!!!!!!!!"<<endl;
creat_Binary_Tree();
cout<<"前序遍历:"<<endl;
pretrav(gen);
cout<<endl;
cout<<"中序遍历:"<<endl;
intrav(gen);
cout<<endl;
cout<<"后序遍历:"<<endl;
postrav(gen);
cout<<endl;
CountLeaf(gen,0);
cout<<"节点总数为:"<<sum<<endl;
return 0;
}

编译器又不是万能的,虽然已经足够只智能,但是对于一个传递了无数次的指针是否仍然有效或者传递过一次以上的数组的范围等问题编译器是做不来的(其实并不是做不来,只是为了效率很少去做这些事,你总不希望一个程序编译一天吧)。所以要依靠代码风格解决这些问题。
其中最常见的是数组访问越界和野指针问题,当然也有部分野引用问题也会造成运行时崩溃。所以你要通过改变编程风格或者确保每次进行内存的相关操作的时候尽力谨慎。前者可以参考 effective C++ 系列和imperfect C++这些书。
另外你编写的代码有很大的问题:
Bitnode *gen;//根节点
int sum;
全局变量只在本文件有效,在函数内部使用全局自动变量是非常危险的。用返回值又不会怎么样……
CountLeaf( T->lchild, count);
CountLeaf( T->rchild, count);
这个会无限循环……这递归没有结束条件……
温馨提示:内容为网友见解,仅供参考
第1个回答  2013-04-13
数组越界访问或者使用了一个指向null的指针 这些都是运行时错误,编译检查不出来

在C++中运行程序,为什么在编译时没有问题,但是回到程序的执行时,就会...
其中最常见的是数组访问越界和野指针问题,当然也有部分野引用问题也会造成运行时崩溃。所以你要通过改变编程风格或者确保每次进行内存的相关操作的时候尽力谨慎。前者可以参考 effective C++ 系列和imperfect C++这些书。另外你编写的代码有很大的问题:Bitnode *gen;\/\/根节点 int sum;全局变量只在本文件有...

求助:为什么我编的C++程序在自己电脑上能正常运行,但编译后挂在后台linu...
你的程序出现异常:一、你要保证你执行的程序是在当前机器上编译通过的才可以 二、要注意机器的CPU类型:64位机和32位机的差异。三、详细检查、调试自己程序中的源代码,是不是存在BUG

为什么C++编写的程序第一次运行没错,之后运行就出现 出现程序错误
可能是第二次运行时,这句没成功,而你没有判断就直接操作文件,所以出现未知错误,你在这里设一个断点看看。fp=fopen("data2.txt","w+");

为什么编译正确的c++程序在运行时会停止工作
编译只是保证没有语法错误,但是不能保证你的程序的算法没有错误,如果你的程序中有比较严重的Bug,如果说访问了系统保护的内存,出于保护,windows会中止你的程序,或是抛出一个异常,如果异常没有被捕获并加以处理,程序也会中止,当然,这时你也有机会用调试工具去debug。这种运行期的错误是需要程序员去...

C++程序,为什么编译通过了,执行时却出现错误
编译通过是因为你没有语法问题,运行出错是你的程序有逻辑问题,空指针,内存漏洞等程序问题

C++的程序运行成功无错误 但进入用户界面后输入一个数字 但一按回车键...
那是因为你没有让程序停止,输入完之后就退出程序了,就看不到执行结果了,在main函数最后加一个getchar();就好了,这句话的作用是让程序在执行到这句话的时候停止并等待用户输入一个字符,就是只有你再输入一个字符的时候程序才能结束。这样你就能看到执行结果了。

C++问题,编译无错,运行老是停止工作,求解答
static int j=1;\/\/\/静态变量 int i; ifstream input; input.open("a.txt"); for(i=0;i<4;i++) { input>>my_username[i]>>my_password[i]; } input.close(); for(i=0;i<4;i++) { if(strcmp(str1,my_username[i])==0 && strcmp(str2...

为什么程序在本地运行正确,提交后会出现错误?
出现运行错误是一种比较棘手的状况,首先必须说明的是,在VC中运行正确并不代表程序是正确的。有很多错误在我们所使用的编写程序的环境中是不会出现的,但却会在其它的环境中出现,而这样的错误往往是最不容易发现的。发生这种情况的原因通常如下:使用了未初始化的变量:有些变量我们假设它的值为0,但...

c++新手问题,为什么我在运行一个程序的时候,电脑会显示该程序已停止工...
1.通常的原因是,你试用了系统未分配给你的内存,例如:int * a;printf(“%d\\n”, *a);出现你说的那种情况,你虽定义了a变量但是a是个指针变量所以*a是a变量内存放地址的内容,但是你并未对编译器声明对该内存的使用所以系统会把它当作类似于黑客的程序将其中止;2.这种情况通常都是因为内存...

用C语言编程程序没有错误为什么结果不对
程序可以运行并不表示程序就是正确的 编译和连接都正确,只能说明编译器对他进行语法等检查 没发现他的错误而已,而既然运行结果是错误的,那就是说明一点 可能是你的算法设计的不当,不能正确的解决问题,这样发生的错误 是运行期错误,在编译连接的过程不会出错的,不过幸好,编译器也为我们 提供了一些解决...

相似回答