关于C语言中的指针问题?

想请问一下,这里我令Root为NULL了之后,Root->data.value里也是空的吗?此时Root->data.value里面应该是什么?为什么这个程序的运行结果啥... 想请问一下,这里我令Root为NULL了之后,Root->data.value里也是空的吗?此时Root->data.value里面应该是什么?为什么这个程序的运行结果啥也没有?以下是我的程序,想请问一下问题出在哪里?当我单步调试的时候,就会出现unhandled exception in exe.0xC0000005:Access Violation. 我觉得可能是while( (Root!=NULL ||!Empty(S)) && (Root->data.value!=x||Root==NULL) ) 这边有问题,但是我也不太清楚。想请教一下。#include<stdio.h>#include<stdlib.h>#define INIT_SIZE 100typedef struct{ char value;}ElementType;typedef struct TNode{ ElementType data; struct TNode*pleft,*pright;}TNode,*TreeRoot;typedef struct{ char *top; char *base; int StackSize;}SqStack;//输入内容建立一个二叉树结构,设计一个函数,//void SearchPath(TreeRoot Root,char x),//给定一个字符和树根,输出根到该字符所在节点路径void CreateTree(TreeRoot &Root){//中序 创建 char c; if((c=getchar())=='\n') { Root=NULL; } else { Root=(TreeRoot)malloc(sizeof(TNode)); Root->data.value=c; CreateTree(Root->pleft); CreateTree(Root->pright); }}void BianliMiddlePrint(TreeRoot Root){//中序遍历 递归 打印 if(Root!=NULL) { BianliMiddlePrint(Root->pleft); printf("%c ",Root->data.value); BianliMiddlePrint(Root->pright); }}void Push(SqStack &S,TreeRoot Root){ if(S.top-S.base>=S.StackSize) { printf("ERROR PUSH\n"); exit(-1); } *S.top++=Root->data.value;}int Empty(SqStack S){ if(S.top==S.base) return 1; else return 0;} TreeRoot GetTop(SqStack S){ if(S.top==S.base) { printf("ERROR\n"); exit(-1); } TreeRoot c; c=(TreeRoot)(S.top-1); return c;}void Pop(SqStack &S){ if(S.top==S.base) { printf("ERROR"); exit(-1); } --S.top;}void InitStack(SqStack &S){ S.base=(char*)malloc(INIT_SIZE*sizeof(char)); if(NULL==S.base) { printf("ERROR\n"); exit(-1); } S.top=S.base; S.StackSize=INIT_SIZE;}void SearchPath(TreeRoot Root,char x){ SqStack S; InitStack(S); TNode*p=NULL; while( (Root!=NULL ||!Empty(S)) && (Root->data.value!=x||Root==NULL) ) { if(Root!=NULL) { Push(S,Root); Root=Root->pleft; } else { Root=GetTop(S); if(Root->pright==NULL || Root->pright==p) {//如果是从右边来的 或者如果右边本来就没有 Pop(S); p=Root; Root=NULL; } else {//如果是从左边来的 Root=Root->pright; } } } printf("%c <- ",x); while(S.base!=S.top) { printf("%c <- ",*--S.top); }}int main(){ TreeRoot Root; char x; printf("请输入该二叉树\n"); CreateTree(Root); BianliMiddlePrint(Root); printf("\n请输入想要查找的字符\n"); scanf("%c",&x); SearchPath(Root,x); return 0;}/*Access Violation 常常在用户运行的程序试图存取未被指定使用的存储区域时用到*/ 展开
 我来答
我爱Xyy
2020-04-16 · TA获得超过280个赞
知道小有建树答主
回答量:508
采纳率:76%
帮助的人:119万
展开全部
同学你是没理解指针是什么意思。
Root = NULL的意思是将Root指向一处空的位置,这时候Root里面的一切都是空的(没有开辟内存空间),当运行到Root->data.value的时候,程序尝试读取Root里面的data元素,这时候就会出现读取内存越界,因为Root指向的地方是空(没有分配内存)。
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
灰白色回
2020-04-16 · 超过98用户采纳过TA的回答
知道小有建树答主
回答量:374
采纳率:78%
帮助的人:16.8万
展开全部

首先呢,在我看来,你的第一个struct 的定义完全没有必要。这个结构体里面只有一个元素,完全没有必要声明一个结构体。

一个简单的宏定义 #define ElemType char就OK了,或者 typedef char ElemType

其次,你的主程序里赋予 Root 一个空,Root 是指向根节点的指针啊,它为空就是说明二叉树压根不存在的。所以也就不能讨论里面的节点的数据是什么这种问题了。

本回答被提问者和网友采纳
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
娱乐文风
2020-04-25 · 贡献了超过121个回答
知道答主
回答量:121
采纳率:100%
帮助的人:5.6万
展开全部

30分钟彻底学会C语言指针

已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 更多回答(1)
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式