C语言数据结构,调试出现访问禁止,怎么回事?

#include<stdio.h>#include<malloc.h>#include<stdlib.h>#defineMaxSize5typedefstruct{int... #include<stdio.h>
#include<malloc.h>
#include<stdlib.h>

#define MaxSize 5

typedef struct {
int data[MaxSize];
int top;
}STACK;
STACK *S;

int InitStack(STACK *S) //初始化
{
S=(STACK *)malloc(sizeof(STACK));
if(!S)
{
printf("分配失败!\n");
return 0;
}
else
{
S->top = -1;
return 1;
}
}

int Push(STACK *S ,int x) //入栈
{
if(S->top==MaxSize-1)
{
printf("栈满!\n");
return 0;
}
else
{
S->top++;
S->data[S->top] =x;
}
return 1;
}

int EmptyStack(STACK *S) //判断是否是空
{
if(S->top == -1)
return 1;
else
return 0;
}

int Pop(STACK *S) //出栈
{
int x;
if( EmptyStack(S) )
{
printf("栈空!\n");
return 0;
}
x= S->data[S->top];
S->top--;
return x;
}

void main()
{
int temp;
InitStack(S);
int i,k,x;

printf("1. 入栈\n");
printf("2. 出栈\n");
printf("3. 推出\n");
printf("输入操作: ");

scanf("%d",&k);
switch(k)
{
case 1:
printf("输入入栈项\n");
scanf("%d",&x);
temp=Push(S,1);
if(temp!=1)
printf("堆栈已满!入栈失败!\n");
else {
printf("成功入栈!\n"); //成功入栈
}
break;

case 2:
printf("出栈:\n");
for(i=0;i<MaxSize;i++)
printf("%d",Pop(S));
break;

default:
exit(0);

}
free(&S);
}
展开
 我来答
qimingxingwen
推荐于2016-11-28 · TA获得超过432个赞
知道小有建树答主
回答量:269
采纳率:50%
帮助的人:182万
展开全部
1、
#include<stdio.h>
#include<malloc.h>
#include<stdlib.h>

#define MaxSize 5

typedef struct {
int data[MaxSize];
int top;
}STACK;
STACK *S;

STACK *InitStack() //初始化
{
STACK *tmp;
tmp=(STACK *)malloc(sizeof(STACK));
if(!tmp)
{
printf("分配失败!\n");
exit(0);
}
else
{
tmp->top = -1;
return tmp;
}
}

int Push(STACK *S ,int x) //入栈
{
if(S->top==MaxSize-1)
{
printf("栈满!\n");
return 0;
}
else
{
//这里的S->top也出错
S->top++;
//下面的句子出错
S->data[S->top] =x;
}
return 1;
}

int EmptyStack(STACK *S) //判断是否是空
{
if(S->top == -1)
return 1;
else
return 0;
}

int Pop(STACK *S) //出栈
{
int x;
if( EmptyStack(S) )
{
printf("\t栈空!\n");
exit(0);
}
x= S->data[S->top];
S->top--;
return x;
}

void main()
{
int temp;
S = InitStack();
int i,k,x;
printf("1. 入栈\n");
printf("2. 出栈\n");
printf("3. 推出\n");
printf("输入操作:\n ");

scanf("%d",&k);
switch(k)
{
case 1:
printf("输入入栈项:\n");
scanf("%d",&x);
temp=Push(S,x);
if(temp!=1)
printf("堆栈已满!入栈失败!\n");
else {
printf("成功入栈!\n"); //成功入栈
printf("%d\n",S->data[S->top]);
}
break;

case 2:
printf("出栈:\n");
for(i=0;i<MaxSize;i++)
printf("\t%d\n",Pop(S));
break;

default:
exit(0);

}
free(S);
}

这样可能就行了
在第一步进行初始化的时候可以通过传回来一个指针赋值给S
最后的时候对S的释放不要再添加S了
因为S本来就是动态分配的对象

2、
如果你要使用自己的函数的话
就把InitStack()中的参数去除
因为如果你在参数中利用了这样的一个参数的话就相当于覆盖了全局变量中的S
最后进行返回值的时候返回的是1或0,此时的局部变量(子函数中的S)被销毁了
这样并没有对S进行赋值,所以以后的访问中会出错
本回答被提问者采纳
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

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

类别

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

说明

0/200

提交
取消

辅 助

模 式