问题描述
我有此代码用于使用带有指针的数组的堆栈实现,该数组执行很多操作,如推入,窥视,弹出,销毁。 我已经通过在工作时全局声明Stack和Stacktop来做到这一点,但是现在我想使用指针进行此实现,所以这是我的代码:
#include <stdio.h>
int Full(int Stack[],int *StackTop,int *StackSize){
if (*StackTop == *StackSize-1){
return 1 ;
}
else{
return 0;
}
}
int Empty(int Stack[],int *StackTop){
if (*StackTop == -1){
return 1 ;
}
else{
return 0;
}
}
void PushStack(int ele,int Stack[],int *StackSize){
if (!Full(Stack,&StackTop,&StackSize)){
Stack[++(*StackTop)]= ele ;
}
else{
printf("Error: Stack is full");
}
}
int PopStack(int Stack[],int *StackTop){
if(!Empty(Stack,&StackTop)){
printf("%d popped !",Stack[*StackTop--]);
}
else{
printf("Error : Stack is Empty");
}
}
void PeepStack(int Stack[],&StackTop)){
printf("%d",Stack[*StackTop]) ;
}
else{
printf("Error : Stack is Empty");
}
}
int DestroyStack(int Stack[],int *StackTop){
printf("Destroying Stack\n");
if (!Empty(Stack,&StackTop)){
while(!Empty(Stack,&StackTop)){
PopStack(Stack,&StackTop);
printf("\n");
}
}
else{
printf("Stack is already Empty");
}
}
int displayStack(int Stack[],int *StackTop){
int i ;
if(Empty(Stack,&StackTop)){
printf("Stack is Empty");
}
else{
printf("displaying Stack ....\n");
for(i=StackTop; i>=0; --i){
printf("| %d |\n",Stack[i]);
}
}
}
int main(void) {
int StackSize = 5 ;
int Stack[5] ;
int StackTop = -1 ;
int *Top = &StackTop ;
int *Size = &StackSize ;
while(1){
int option,ele ;
printf("\n Options : \n");
printf("1. Push \n");
printf("2. Pop \n");
printf("3. Peep \n");
printf("4. Destroy \n");
printf("5. display \n");
printf("6. Exit \n");
printf("Enter Option number : ");
scanf("%d",&option);
switch(option){
case 1 :
printf("Enter element you want to push : ");
scanf("%d",&ele);
PushStack(ele,&Stack,&Top,&Size);
break;
case 2 :
PopStack(Stack,&Top);
break;
case 3 :
PeepStack(Stack,&Top);
break;
case 4 :
DestroyStack(Stack,&Top);
printf("Stack Destroyed succesfully !");
break ;
case 5 :
displayStack(Stack,&Top);
break;
case 6 :
break ;
default:
printf("Invalid option");
}
printf("\n");
if(option==6){
break;
}
}
return 0;
}
当我在repl.it上执行此操作时,我能够给出第一个输入,即选项号,但随后却给出了分段错误。 当我在代码块上执行此操作时,我得到的过程返回了一些数字和一个十六进制代码。
解决方法
您在指针上使用&
运算符,该运算符是指向指针的指针。
基本上,您的模式是这样的:
void Foo(int *bar)
{
*bar = 123;
}
int main()
{
int thing;
int *p = &thing; // p points to thing
Foo(&p);
printf("%d",&p); // your expected output is: 123
}
但不是:
Foo(&p);
您想要的
Foo(p);
因为p
已经 一个指针。
但是,如果您想使用thing
,则需要编写:
Foo(&thing);
因为&thing
指向thing
就像p
指向thing
一样。