gpt4 book ai didi

c - 与动态数组的堆栈: segfaults when popping value multiple times

转载 作者:行者123 更新时间:2023-11-30 16:56:00 25 4
gpt4 key购买 nike

我有一个使用动态分配的数组实现的堆栈,该数组是使用 scanf() 填充的。推送功能工作正常,只是当我打印堆栈时,我总是在输出的开头得到两个额外的零。尝试弹出堆栈只会弹出零,并且一旦弹出两次就会出现段错误。我无法弄清楚这个问题发生在哪里。

   #include <stdio.h>
#include <stdlib.h>
#include <string.h>
/*Creates struct of stack*/
typedef struct Stack{
int *ptArray;
int top;
int stackSize;
int itemsInStack;
} Stack;

/*Initialized stack*/
Stack* stackInit(){
Stack *a;
a= (Stack*) malloc(sizeof(Stack));
a-> ptArray=(int*) malloc(sizeof(int)) ;
a-> top=0;
a-> stackSize=1;
return a;
}

void stackPush( Stack *stx, int val){

if( (stx->top) == (stx->stackSize)){
grow(&stx->ptArray, &stx->stackSize);
}
stx->ptArray[stx->top]= val;
stx->top++;
stx->itemsInStack++;
}
/*Grows astack array when space runs out*/
void grow(int** array, int *sz){
int *temp;
temp= (int*) malloc(sizeof(int)* (*sz+2) );
int i;
for( i=0; i< *sz; i++)
temp[i]=( *array)[i];
free(*array);
*array= temp;
*sz=*sz+2;
}

void stackPop( Stack* stx){
free(stx->ptArray[stx->top]);
stx->top--;
stx->stackSize--;
stx->itemsInStack--;

}

void showStack(Stack* s){
int i;
printf("\n");
for(i=s->stackSize; i>-1; i--){
printf("%d\n", s->ptArray[i]);
}
}

void main(int argc, char** argv){

Stack *stackArray;
stackArray= stackInit();

int val=0;
while (val != -999) {
scanf("%d", &val);
if (val == -999) {
break;
}
stackPush(stackArray, val);
}

showStack(stackArray);
stackPop(stackArray);
stackPop(stackArray);
showStack(stackArray);
stackPop(stackArray);
showStack(stackArray);

}

最佳答案

您的 malloc/free 对有问题。

您像这样分配数组:

 a-> ptArray=(int*) malloc(sizeof(int)) ;

如果您需要增加堆栈,您可以像这样分配一个新数组:

 temp= (char*) malloc(sizeof(char)* (*sz+2) );

所以你一次性分配整个数组。

但由于某些原因,当您弹出项目时,您会执行以下操作:

 free(stx->ptArray[stx->top]);

你从未分配过这个。您分配了 ptArray,因此如果您必须释放某些内容,那就是 ptArray。

就像您在增长函数中所做的那样:

  free(*array);

我希望您的错误现在已经清除。这就是导致段错误的原因。但是,您在堆栈管理方面仍然存在一些问题。

关于c - 与动态数组的堆栈: segfaults when popping value multiple times,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40077341/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com