Стек с динамическим массивом: segfaults при многократном извлечении значения

У меня есть стек, реализованный с динамически выделенным массивом, который заполняется с помощью 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);

    }

person Alcore    schedule 17.10.2016    source источник
comment
См. Как спросить. Используйте отладчик, чтобы получить конкретную проблему.   -  person too honest for this site    schedule 17.10.2016
comment
int *temp; temp= (char*) malloc(sizeof(char)* (*sz+2) ); почему вы переводите его в char* ?   -  person tesseract    schedule 17.10.2016
comment
это была ошибка, это должно быть int   -  person Alcore    schedule 17.10.2016
comment
вы также должны выделить int, а не char   -  person tesseract    schedule 17.10.2016
comment
grow(&stx->ptArray, &stx->stackSize); здесь массив уже является указателем, вы можете просто сказать grow(stx->ptArray, &stx->stackSize), а затем void grow(int* array, int *sz), а затем использовать обычную запись массива.   -  person tesseract    schedule 17.10.2016


Ответы (1)


У вас проблема в парах malloc/free.

Вы выделяете массив следующим образом:

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

Если вам нужно увеличить стек, вы выделяете новый массив следующим образом:

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

Таким образом, вы выделяете весь массив за один раз.

Но по некоторым причинам, когда вы выталкиваете элемент, вы делаете это:

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

Вы никогда не выделяли это. вы выделили ptArray, поэтому, если вам нужно что-то освободить, это ptArray.

Так же, как вы сделали в своей функции роста:

  free(*array);

Я надеюсь, что ваша ошибка теперь ясна. Это то, что вызывает ошибку сегментации. Однако у вас все еще есть некоторые проблемы с управлением вашим стеком.

person Hector Roussille    schedule 17.10.2016
comment
Это устраняет эту насущную проблему - большое спасибо. Вы правы, я все еще должен справиться с этим лучше. - person Alcore; 17.10.2016