堆栈实现给出段错误

Stack implementation is giving Segfault

我目前正在编写自己的虚拟机。我必须实现堆栈。无论出于何种原因,每当我调用 sienna_stack_push(processor->stack, 0); 它都会给我一个段错误。

这里是栈的实现

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

// Helper functions

int is_empty(sienna_stack_t* stack){
    return stack->top == -1;
}

int is_full(sienna_stack_t* stack){
    return stack->top == stack->max_size;
}

void sienna_stack_init(sienna_stack_t* stack, int capacity){
    stack = (sienna_stack_t*)malloc(sizeof(sienna_stack_t));
    stack->max_size = capacity;
    stack->top = -1;
    stack->items = (int*)calloc(capacity, sizeof(int));

}

void sienna_stack_push(sienna_stack_t* stack, int value){
    if(is_full(stack)){
        printf("FATAL: Stack overflow!\n");
        exit(-1);
    }
    stack->items[++stack->top] = value;
}

int sienna_stack_pop(sienna_stack_t* stack){
    if(is_empty(stack)){
        printf("FATAL: Stack underflow!\n");
        exit(-1);
    }
    return stack->items[stack->top--];
}

int sienna_stack_peek(sienna_stack_t* stack){
    return stack->items[stack->top];
}

这里是堆栈结构定义

typedef struct {
    int max_size;
    int top;
    int* items;
} sienna_stack_t;

这是我在用

#include <stdio.h>
#include "stack.h"

int main() {
    sienna_stack_t stack;
    sienna_stack_init(&stack, 0xFFFF);
    sienna_stack_push(&stack, 0);
}

错误是说调用 sienna_stack_push();

时发生了错误

我猜,你想保留 sizeof(int) * capacity 字节的内存,但实际上你没有保留任何东西,因为 calloc() 的第一个参数是 0。因此,你想访问非保留的内存,导致崩溃。

编辑

你的初始化错误。 stack 是一个静态变量。当你调用 init 时,你传递了这个变量的地址。现在您分配一个丢失的新(匿名)变量。您可以将 stack 更改为指针变量:

void sienna_stack_init(sienna_stack_t** stack, int capacity){
   *stack = (sienna_stack_t*)malloc(sizeof(sienna_stack_t));
   (*stack)->max_size = capacity;
   (*stack)->top = -1;
   (*stack)->items = (int*)calloc(capacity, sizeof(int));
}
 
// ...

int main(int argc, char *argv[]){
   sienna_stack_t *stack;
   sienna_stack_init(&stack, 0xFFF);
   sienna_stack_push(stack, 0);
}