[英]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.