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

想请问一下,这里我令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 常常在用户运行的程序试图存取未被指定使用的存储区域时用到*/

第1个回答  2020-04-16
同学你是没理解指针是什么意思。
Root = NULL的意思是将Root指向一处空的位置,这时候Root里面的一切都是空的(没有开辟内存空间),当运行到Root->data.value的时候,程序尝试读取Root里面的data元素,这时候就会出现读取内存越界,因为Root指向的地方是空(没有分配内存)。
第2个回答  2020-04-16

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

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

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

本回答被提问者和网友采纳
第3个回答  2020-04-25

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