2016-10-17 6 views
0

У меня есть стек, реализованный с динамически распределенным массивом, который заполняется с помощью scanf(). Функция push работает правильно, за исключением того, что когда я распечатываю стек, я всегда получаю два дополнительных нуля в начале вывода. Попытка выставить стек только выдает нули, и он segfaults, как только popping произойдет дважды. Я не могу понять, где эта проблема.Стек с динамическим массивом: segfaults при появлении значения несколько раз

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

    } 
+0

См. [Ask]. Используйте отладчик, чтобы получить конкретную проблему. – Olaf

+0

'int * temp;' 'temp = (char *) malloc (sizeof (char) * (* sz + 2));' почему вы отбрасываете его на char *? – tesseract

+0

Это была ошибка, это должно быть int – Alcore

ответ

0

У вас возникли проблемы с вашим парком malloc/free.

Вы выделяете массив так:

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

Если вам нужно увеличить стек вы выделить новый массив так:

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

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

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

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

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

Так же, как вы делали в вашей функции Grow:

free(*array); 

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

+0

Это исправляет эту проблему - спасибо. Вы правы, мне все равно нужно справляться с этим лучше. – Alcore

 Смежные вопросы

  • Нет связанных вопросов^_^