使用指针数组的C for Stack实现中的分段错误

问题描述

我有代码用于使用带有指针的数组的堆栈实现,该数组执行很多操作,如推入,窥视,弹出,销毁。 我已经通过在工作时全局声明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一样。