C语言自研虚拟机栈实现调用sienna_stack_push触发段错误求助
问题根因分析
- 初始化函数实现错误
C语言函数参数为值传递,你在sienna_stack_init内部为形参stack重新分配内存的操作,仅会修改函数内部的局部指针变量,不会修改外部传入的结构体的实际内容。你在main中声明的栈结构体成员全程都是未初始化的垃圾值,调用sienna_stack_push时访问非法内存触发段错误。 - 栈满判断逻辑错误
当前is_full的判断条件会导致数组越界:栈的top从-1开始计数,当top等于max_size - 1时栈就已经满了,原判断条件会允许写入超出items数组申请长度的位置,触发内存越界。
修复代码
1. 修正初始化函数
删除sienna_stack_init中多余的结构体内存分配行,直接修改传入指针指向的结构体成员:
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)); }
2. 修正栈满判断逻辑
int is_full(sienna_stack_t* stack){ return stack->top == stack->max_size - 1; }
可选:补充栈销毁函数避免内存泄漏
void sienna_stack_destroy(sienna_stack_t* stack) { free(stack->items); stack->items = NULL; stack->max_size = 0; stack->top = -1; }
验证
修复后你的示例代码可正常运行,不会再触发段错误。
内容的提问来源于stack exchange,提问作者ANTHONY STERLING-PALMARI
相关产品推荐
相关产品推荐

