使用动态数组进行堆叠:多次弹出值时发生段错误

时间:2016-10-17 01:34:49

标签: c stack dynamic-arrays

我有一个使用动态分配的数组实现的堆栈,使用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);

    }

1 个答案:

答案 0 :(得分:0)

你的malloc /免费夫妻有问题。

您可以像这样分配数组:

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

如果你需要增加堆栈,你可以分配一个新的数组:

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

所以你将整个数组分配到一个。

但由于某些原因,当你弹出一个项目时,你会这样做:

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

你从未分配过这个。你分配了ptArray所以如果你必须释放一些东西,那就是ptArray。

就像你在成长函数中所做的那样:

  free(*array);

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