下列程序运行时会崩溃,请找出错误并改正,并且说明原因

转载 2015年07月10日 18:00:03

下列程序运行时会崩溃,请找出错误并改正,并且说明原因。

#include <stdio.h> 
#include 
<malloc.h> 

typedef 
struct

    TNode
* left; 
    TNode
* right; 
    
int value; 
} TNode; 

TNode
* root=NULL; 
void append(int N); 

int main() 

    append(
63); 
    append(
45); 
    append(
32);
    append(
77); 
    append(
96); 
    append(
21); 
    append(
17); // Again, 数字任意给出 


void append(int N) 

    TNode
* NewNode=(TNode *)malloc(sizeof(TNode)); 
    NewNode
->value=N; 

    
if(root==NULL) 
    { 
        root
=NewNode;
        
return;
    } 
    
else 
    { 
        TNode
* temp; 
        temp
=root; 
        
while((N>=temp.value && temp.left!=NULL) || (N<temp. value && temp. right!=NULL)) 
        { 
            
while(N>=temp.value && temp.left!=NULL)
                temp
=temp.left;
            
while(N<temp.value && temp.right!=NULL)
                temp
=temp.right;
        }
        
if(N>=temp.value)
            temp.left
=NewNode; 
        
else
            temp.right
=NewNode;
        
return
    }
}

 

 

解答:

 

  1. //下列程序运行时会崩溃,请找出错误并改正,并且说明原因。  
  2. /* 
  3. 此程序的功能是完成一个有序二叉树的建立,使得左子树结点的值小于根结点, 
  4. 右子树大于根结点. 题目程序中结构体定义的地方有误,在TNode名字出现之前, 
  5. 就在结构体内使用TNode,将导致编译错误.另外题目中append函数中的所有temp的点号操作符都应改成->, 
  6. 因为temp是个指针.至于题目中所说的程序在运行时崩溃出现在append函数中的对temp->left和temp->right操作时候,  
  7. 因为每创建一个新结点的时候都没将left和right成员初始化为空指针,会导致append函数中的while循环访问到非法内存, 
  8. 从而导致程序崩溃. 为了方便测试,添加了函数print_tree打印树的结点内容, 
  9. 另外补充了一个函数free_tree来释放动态分配的内存.修改后的程序如下: 
  10. */  
  11. #include <iostream>  
  12. using namespace std;  
  13. //typedef struct{   //错误1 TNode名字出现前,就在结构内使用TNode将导致编译错误  
  14. typedef struct TNode{ //应该这样写  
  15.     TNode* left;  
  16.     TNode* right;   
  17.    int value;   
  18. }TNode;  
  19.   
  20. TNode* root=NULL;   
  21. void append(int N);   
  22. void free_tree(TNode *root);  
  23. void print_tree(TNode *root);  
  24.   
  25.   
  26. int main()   
  27. {   
  28.     append(63);   
  29.     append(45);   
  30.     append(32);   
  31.     append(77);   
  32.     append(96);   
  33.     append(21);   
  34.     append(17); // Again, 数字任意给出   
  35.     print_tree(root);  
  36.     cout<<"\n memory released !\n";  
  37.     free_tree(root);  
  38.     system("pause");  
  39. return 0;  
  40. }   
  41.   
  42. void append(int N)   
  43. {  
  44.     TNode* NewNode=(TNode *)malloc(sizeof(TNode));   
  45.     if (!NewNode)  
  46.     {  
  47.         cout<<"memory alloc failure!\n";  
  48.         exit(1);  
  49.     }  
  50.   
  51.     NewNode->value=N;   
  52.     //NewNode->left;  
  53.     //NewNode->right; //错误2 没有初始化新结点的left和right成员为空指针,  
  54.                       //导致append函数中while循环访问到非法内存,从而导致运行时崩溃  
  55.     NewNode->left=NULL;  
  56.     NewNode->right=NULL;  
  57.     if(root==NULL)   
  58.     {   
  59.         root=NewNode;   
  60.         return;  
  61.     }   
  62.     else   
  63.     {   
  64.         TNode* temp;   
  65.         temp=root;   
  66.         //while((N>=temp.value && temp.left!=NULL) || (N<temp. value && temp. right!=NULL))   
  67.         //错误3 temp是指针,则下面引用成员应该使用->而不是.(点)  
  68.         while((N>=temp->value && temp->left!=NULL) || (N<temp->value&&temp->right!=NULL))   
  69.         {  
  70.                while(N>=temp->value && temp->left!=NULL)   
  71.                    temp=temp->left;   
  72.                while(N<temp->value && temp->right!=NULL)  
  73.                    temp=temp->right;   
  74.         }   
  75.   
  76.         if(N>=temp->value)   
  77.             temp->left=NewNode;   
  78.         else   
  79.             temp->right=NewNode;   
  80.         return;   
  81.     }  
  82. }   
  83.   
  84.   
  85. //释放内存函数  
  86. void free_tree(TNode *root){  
  87.     if (!root->left && !root->right)  
  88.     {  
  89.         free(root);  
  90.         return;  
  91.     }  
  92.     if (root->left)  
  93.     {  
  94.         free_tree(root->left);  
  95.     }  
  96.     else{  
  97.         free_tree(root->right);  
  98.     }  
  99. }  
  100.   
  101.   
  102. //打印函数  
  103. void print_tree(TNode *root){  
  104.     if (!root->left && !root->right)  
  105.     {  
  106.         cout<<root->value<<" ";  
  107.         return;  
  108.     }  
  109.     if (root->right)  
  110.         print_tree(root->right);  
  111.   
  112.         cout<<root->value<<" ";  
  113.   
  114.     if (root->left)  
  115.     {  
  116.         print_tree(root->left);  
  117.     }  
  118. }  


版权声明:本文为博主原创文章,未经博主允许不得转载。

程序崩溃的调试方法及原因分类

作者 邵发 官网 http://afanihao.cn 本文是 C/C++学习指南(补充篇)- 单步调试 的官方文档。。。程序崩溃的原因分类 1. 函数栈溢出 一个变量未初化、未赋值,就读取它的值...
  • iamshaofa
  • iamshaofa
  • 2016年04月11日 10:34
  • 8327

IOS调试技巧:当程序崩溃的时候怎么办 iphone IOS

from:http://article.ityran.com/archives/1143 有这样一种情形:当我们正在快乐的致力于我们的app时,并且什么看都是无比顺利,但是突然,坑爹啊,它崩溃了...
  • wmqi10
  • wmqi10
  • 2013年02月19日 22:24
  • 24646

TOMCAT异常退出分析和解决方法

最近遇到一个很诡异的问题,远程登录服务器,本来是想查看一下Tomcat的运行情况,结果用鼠标把窗体一拖,Tomcat居然自己关上了!就好像是自己按下了Ctrl+C一样!同事的电脑都没有出现这种情况,后...
  • lfsf802
  • lfsf802
  • 2015年09月29日 19:39
  • 10217

下列程序运行时会崩溃,请找出错误并改正,并且说明原因

下列程序运行时会崩溃,请找出错误并改正,并且说明原因。 #include stdio.h>  #include malloc.h>  typedef struct {      TN...
  • zhuimengzh
  • zhuimengzh
  • 2011年08月15日 20:53
  • 2619

程序运行时随机崩溃的几点调试方法

程序运行时随机崩溃的几点调试方法运行时随机崩溃,只可能是内存管理的问题。因为如果没有内存问题,程序不会崩溃,最多只是结果不对而已。 写一段内存越界,直接崩溃 写一段内存越界,不崩溃,而是破坏其他内存数...
  • lonelyrains
  • lonelyrains
  • 2016年04月06日 21:36
  • 1891

完整的俄罗斯方块C#源程序,运行程序时将目录下的images和sounds文件夹拷贝到bin/debug或者bin/Release目录下,否则运行时会找不到文件。

  • 2009年02月04日 15:33
  • 2.51MB
  • 下载

Android程序运行时出现java.lang.OutOfMemoryError 错误

Android程序运行时出现java.lang.OutOfMemoryError 错误 如下图所示:
  • cxc19890214
  • cxc19890214
  • 2014年10月14日 22:13
  • 1927

该程序在运行时会创建一个JOB,并且将该自己以JOB后台方式运行,并且可以从前台传递参数到后台JOB

REPORT ymais_sust. TABLES vbap. PARAMETERS: p_back . SELECT-OPTIONS: s_vbeln FOR vbap-vbeln . DATA:...
  • champaignwolf
  • champaignwolf
  • 2017年12月25日 10:44
  • 81

linux中C程序运行时怪异的段错误--linux中因栈空间不足而出现的运行时段错误

linux中C程序段错误 怪异 段错误 linux中因栈空间不足 运行时段错误
  • yygydjkthh
  • yygydjkthh
  • 2011年02月15日 00:26
  • 2796

怎样解决Qt编译出的程序运行时缺少libgcc_s_dw2-1.dll 文件的问题?

当我们用Qt写C程序软件时,经常会遇到这样的情况:当我们单独运行编译出来的程序时,经常会报这样的错误:...
  • suda_lv
  • suda_lv
  • 2017年03月14日 17:41
  • 283
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:下列程序运行时会崩溃,请找出错误并改正,并且说明原因
举报原因:
原因补充:

(最多只允许输入30个字)