堆栈实现给出段错误
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);
}
我目前正在编写自己的虚拟机。我必须实现堆栈。无论出于何种原因,每当我调用 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);
}