使用动态内存构建堆栈的问题 (C)

问题描述 投票:0回答:0

我正在尝试学习数据结构,因此我做了一个练习,我们从用户那里读取一个字符串,然后我们评估该字符串,以检查括号是否格式正确,例如输入:

(()
,输出:
 no
,它们的格式不正确。尽管当我尝试运行我的代码时,它不仅给出了错误的输出,而且还向我显示了错误:
free(): invalid pointer
。我用我的代码运行了 valgrind,它向我显示:
Invalid free() ... Address.. is 12 bytes before a block of size 16 alloc´d
我将在下面发布我的代码片段。 我是初学者,所以任何帮助将不胜感激,我也乐于接受批评。

typedef struct {
    int *v;    
    int cap;    
    int sz;
} stack;

stack *build() {
    stack *new = (stack *)malloc(sizeof(stack));
    new->v = (int *)malloc(sizeof(int) * 4);
    new->cap = 4;
    new->sz = 0;
    return new;
}

int is_empty(stack *s) {
    return s->sz == 0;
}

int push(stack *s, int e) {
    int success = 1;

    if (s->sz == s->cap) {
        int *tmp = (int *)realloc(s->v, (s->cap + 1) * sizeof( int));
        if ((success = tmp != NULL)) {
            s->v = tmp;
            ++s->cap;
        }
    }

    if (success) {
        s->v[s->sz++] = e;
    }

    return success;
}

int top(stack *s) {
    return *(s->v);
}

int pop(stack *s) {
    int value;

    if (is_empty(s))
        return -1;

    value = *(s->v);
    s->v--;
    s->sz--;
    return value;   
}

void destroy(stack *s) {
    s->v -= s->sz + 1;
    free(s->v);
    free(s);
}

int match(char p1, char p2) {
    if (p1 == '(')
        return (p1 - p2) == '(' - ')';
    else if (p1 == '[')
        return (p1 - p2) == '[' - ']';
    else
        return (p1 - p2) == '{' - '}';
}

int main() {
    int c;
    stack *s = build();
    while ((c = getchar()) != EOF && c != '\n') {
        if (c == '(' || c == '[' || c == '{')
             push(s, c);
        else if (c == ')' || c == ']' || c == '}') {
            if (!match(pop(s), c)) {
                printf("no\n");
                destroy(s);
                return 0;
            }
        }
    }
    puts((is_empty(s)) ? "yes" : "no");
    destroy(s);
    return 0;
}
c pointers data-structures stack dynamic-memory-allocation
© www.soinside.com 2019 - 2024. All rights reserved.