簡體   English   中英

C 中的分段錯誤,用於使用帶有指針的 arrays 實現堆棧

[英]Segmentation fault in C for Stack implementation using arrays with pointers

我有這個代碼用於堆棧實現,使用 arrays 和指針,這些指針執行許多操作,如推送、窺視、彈出、銷毀。 我已經通過全局聲明 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 *StackTop, 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[], int *StackTop){
   if(!Empty(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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM