user-0 提问: 求解救！编程问题

回复:
user: user-1
content: 没有什么比LZ自己打开debugger跟一遍更实际了。

user: user-2
content: 自己做作业去！

user: user-3
content: 啊地方撒发生的发发发

user: user-2
content: 错误原因：对指针吃不透的后果！笑而不答！

user: user-2
content: 不同意楼上的做法，不益于楼主独立分析的精神！

user: user-4
content: 求送分。  #include<stdio.h> #include<string.h> #include<stdlib.h>  #define OK 1 #define ERROR 0  typedef struct BiTNode{     char data;     struct BiTNode *lchild, *rchild; }BiTNode;  typedef struct{ 	BiTNode *base; 	BiTNode *top; 	int stacksize; }Stack;  BiTNode *CreateBiTree(); void InOrderTraverse(BiTNode *T); void InOrderTraverse_NonRecursive(BiTNode *T); void GetHighth(); void GetNodeNum(); void GetLeafNum(); void ExchangeLRtree(); Stack *InitStack(); int StackEmpty(Stack *S); void Push(Stack *S, BiTNode *p); BiTNode *Pop(Stack *S);   int main() { 	BiTNode *T; 	 	T = CreateBiTree(); 	printf("\n"); 	InOrderTraverse(T); 	printf("\n"); 	InOrderTraverse_NonRecursive(T); 	printf("\n"); 	return 0; }  BiTNode *CreateBiTree() { 	char ch; 	BiTNode *T; 	scanf("%c", &ch); 	if(ch == ' ') 		return NULL; 	else{        	T = (BiTNode *)malloc(sizeof(BiTNode));        	if(!T) 			exit(0);         T->data = ch; 		T->lchild = CreateBiTree(); 		T->rchild = CreateBiTree();	 		return T; 	} }  void InOrderTraverse(BiTNode *T) { 	if(T){ 		if(T->lchild) 			InOrderTraverse(T->lchild); 		printf("%c", T->data); 		if(T->rchild) 			InOrderTraverse(T->rchild); 	} }   void InOrderTraverse_NonRecursive(BiTNode *T) { 	Stack *S = NULL; 	BiTNode *p; 	 	S = InitStack(); 	p = T; 	if(!p){ 		printf("Empty Tree!\n"); 		return; 	} 	while(p || !StackEmpty(S)){ 		if(p) { 			Push(S, p); 			p = p->lchild; 		} else { 			p = Pop(S); 			printf("%c", p->data); 			p = p->rchild; 		} 	} }  void GetHighth(){} void GetNodeNum(){} void GetLeafNum(){} void ExchangeLRtree(){}  Stack *InitStack() { 	Stack *S = (Stack *)malloc(sizeof(Stack)); 	if(!S) 		exit(ERROR); 	S->base = (BiTNode *)malloc(10 * sizeof(BiTNode)); 	if(!S->base) 		exit(ERROR); 	S->top = S->base; 	S->stacksize = 10; 	return S; }  int StackEmpty(Stack *S) { 	if(S->top == S->base) 		return OK; 	return ERROR; }  void Push(Stack *S, BiTNode *p) { 	if(S->top - S->base >= S->stacksize){ 		S->base = (BiTNode *)realloc(S->base, (++S->stacksize) * sizeof(BiTNode)); 		S->top = S->base + S->stacksize - 1; 	}	 	*(S->top) = *p; 	S->top++; }  BiTNode *Pop(Stack *S) { 	if(S->top == S->base) 		exit(ERROR); 	S->top--; 	return S->top; }

user: user-5
content: 崩溃的时候在弹出的对话框按相应按钮进入调试，按Alt+7键查看Call Stack里面从上到下列出的对应从里层到外层的函数调用历史。双击某一行可将光标定位到此次调用的源代码或汇编指令处。

user: user-2
content: 测试case: case 1: 执行程序，直接输入空格，程序崩溃 case 2: 执行程序，输入非空格，程序无止境运行，不能结束输入

user: user-0
content: 首先非常感谢大家的指导，通过上网查看调试，今天早上经过反复调试，总算找到问题了。真的，很多时候是知识面不全，没有吃透的问题。在这之前还不懂怎么调试，只知道在在代码行间插入输出语句以确定程序运行进程，但当我进入调试界面才发现里面里面的数据非常全，非常有助于代码分析。真的很感谢你们，我相信，每个人的成长道路上总少不了别人的帮助。

user: user-0
content: 要实际，不要口水！

user: user-6
content: 引用 2 楼 zhao4zhong1 的回复:代码功能归根结底不是别人帮自己看或讲解或注释出来的；而是被自己静下心来花足够长的时间和精力亲自动手单步或设断点或对执行到某步获得的中间结果显示或写到日志文件中一步一步分析出来的。 提醒：再牛×的老师也无法代替学生自己领悟和上厕所！ 单步调试和设断点调试是程序员必须掌握的技能之一。 错误信息是什么？stack s没有分配空间就调用了s->base

user: user-5
content: 代码功能归根结底不是别人帮自己看或讲解或注释出来的；而是被自己静下心来花足够长的时间和精力亲自动手单步或设断点或对执行到某步获得的中间结果显示或写到日志文件中一步一步分析出来的。 提醒：再牛×的老师也无法代替学生自己领悟和上厕所！ 单步调试和设断点调试是程序员必须掌握的技能之一。

user: user-7
content: vc6.0没问题编译，连接都正常