我有一个使用动态分配的数组实现的堆栈,使用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);
}
答案 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);
我希望你的错误现在很清楚。这就是导致分段错误的原因。但是,您的堆栈管理仍然存在一些问题。