使用动态数组堆叠:多次弹出值时出现段错误

Stack with a dynamic array: segfaults when popping value multiple times

我有一个使用动态分配数组实现的堆栈,该数组使用 scanf() 填充。 push 函数正常工作,除了当我打印堆栈时,我总是在输出的开头得到两个额外的零。尝试弹出堆栈只会弹出零,一旦弹出发生两次,它就会出现段错误。我不知道这个问题发生在哪里。

   #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);

我希望你的错误很清楚 now.This 是导致分段错误的原因。但是,您在堆栈管理方面仍然存在一些问题。