使用动态数组堆叠:多次弹出值时出现段错误
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 是导致分段错误的原因。但是,您在堆栈管理方面仍然存在一些问题。
我有一个使用动态分配数组实现的堆栈,该数组使用 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 是导致分段错误的原因。但是,您在堆栈管理方面仍然存在一些问题。