正常的堆栈函数错误,但在设置断点时不会

时间:2016-07-25 19:39:10

标签: c stack runtime-error free abort

我尝试使用动态数组创建堆栈,并且在尝试运行DeleteStack()函数时遇到错误,但是,如果我在函数之前设置断点并且运行主程序直到那一点,然后继续经过它,它正确执行。有人请告诉我我做错了什么以及为什么我会看到这种行为?

main.c

#include <stdio.h>
#include <stdlib.h>
#include <limits.h>
#include "dynamic_array_stack.h"

int main() {

    // create stack
    DynArrayStack *S = CreateStack();

    // fill stack
    for (int i = 1; i <= 10; i++)
        Push(S, i);

    // try pushing past capacity, no error (realloc's)
    Push(S, 42);

    // top of stack
    printf("Top of stack is %d\n", Top(S));

    // pop all elements of stack
    while (Top(S) != INT_MIN) {
        printf("%d\n", Pop(S));
    }

    // delete stack, check pointer again
    DeleteStack(S);

    return 0;
}

dynamic_array_stack.h

#include <stdio.h>
#include <stdlib.h>
#include <limits.h>

typedef struct dynarraystack {
    int top;
    int capacity;
    int *array;
} DynArrayStack;

DynArrayStack* CreateStack() {
    DynArrayStack* S = malloc(sizeof(DynArrayStack));
    if (!S) {
        printf("Error: Could not create stack.\n");
        return NULL;
    }
    S->capacity = 1;
    S->top = -1;
    S->array = malloc(S->capacity * sizeof(int));
    if (!S->array) {
        printf("Error: could not create stack.\n");
        return NULL;
    }   
    return S;   
}

int isFullStack(DynArrayStack *S) {
    return (S->top == S->capacity-1);
}

void DoubleStack(DynArrayStack *S) {
    S->capacity *= 2;
    S->array = realloc(S->array, S->capacity);
}

void Push(DynArrayStack *S, int data) {
    if (isFullStack(S))
        DoubleStack(S);
    S->array[++S->top] = data;
}

int isEmptyStack(DynArrayStack *S) {
    return S->top == -1;
}

int Top(DynArrayStack *S) {
    if(isEmptyStack(S))
        return INT_MIN;
    return S->array[S->top];        
}

int Pop(DynArrayStack *S) {
    if (isEmptyStack(S)) {
        printf("Array is empty. Returning INT_MIN.\n");
        return INT_MIN;
    }
    return S->array[S->top--];
}

void DeleteStack(DynArrayStack *S) {
    if (S) {
        if (S->array)
            free(S->array);
        free(S);
        printf("Stack deleted.\n");
    }
}

编辑:实际上,如果我设置了两个断点,只有一个断点,一个在while循环之前(所以我手动逐步完成),另一个在DeleteStack()函数之前。但仍然感到困惑。

0 个答案:

没有答案