我在做学校作业,遇到了两个问题。我必须用数组来模拟堆栈。
我目前的代码如下:

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

typedef struct {
    int capacity;
    int * array;
    int size;
} stack_tt;
int pop(stack_tt * stack_p);
void push(stack_tt * stack_p, int value);
int top(stack_tt * stack_p);
stack_tt * newStack(void);
int empty(stack_tt * stack_p);

int main() {
    stack_tt * myStack = newStack();
    push(myStack, 123);
    push(myStack, 99);
    push(myStack, 4444);
    while (!empty(myStack)) {
        int value;
        value = pop(myStack);
        printf("popped: %d\n", value);
    }
    return 0; }

stack_tt * newStack(){
    stack_tt * newS = malloc(sizeof(stack_tt) * 20);
    (*newS).capacity = 1;
    (*newS).size = 0;
    return newS;
}

void push(stack_tt * stack_p, int value){
    if ((*stack_p).size >= (*stack_p).capacity) {
        (*stack_p).capacity*=2;
        //realloc(stack_p, stack_p->capacity * sizeof(stack_tt));
    }
    (*stack_p).array = &value;
    (*stack_p).size++;
}

int pop(stack_tt * stack_p){
    (*stack_p).size--;
    int fap = *(*stack_p).array;
    return fap;
}

int empty(stack_tt * stack_p){
    if ((*stack_p).size >= 1)
        return 0;
    return 1;
}

当我打电话的时候
而(!)空(myStack)
它将数组中的值更改为1。
其次,每当我尝试以下操作时,我无法更改数组中的单个值:
(*stack_p).array[0]=值;
它不知道该在记忆中寻找什么。
我希望有人能帮我:)

最佳答案

不需要为20个stack_tt类型的结构分配空间,只需要为一个结构分配空间:

stack_tt * newS = malloc(sizeof(stack_tt));

但是,您需要为结构成员数组的元素分配空间:
newS->array = malloc( sizeof(int)*20);
newS->size = 0;
newS->capacity = 20;

现在可以使用数组成员。
将值推送到“堆栈”时,不应使用本地变量的地址覆盖数组成员,这是没有意义的,除了释放以前分配的内存之外,还会导致未定义的行为。相反,只需在函数array中将值赋给成员push
stack_p->array[stack_p->size] = value;
stack_p->size++;

类似地,当您弹出一个元素时,从成员中获取当前元素:
stack_p->size--;
int fap = stack_p->array[stack_p->size];

其余的函数和代码应该以相同的方式修复。

关于c - C:函数调用覆盖了堆栈元素,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/37097470/

10-11 22:54
查看更多