You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

C语言自定义栈头文件调用push/pop操作时程序异常终止问题求助

问题诱因

程序崩溃的直接诱因来自调用代码的两处低级内存错误,和void指针传递无关:

  • scanf("%d" , val) 传参错误:scanf读取数值需要传入变量的内存地址,你直接传递val变量的值作为地址,相当于向非法内存地址写入数据,触发段错误直接终止程序。
  • 打印语句中解引用野指针:printf("...PUSHED %d IN STACK...\n", *x) 里的指针x从未被赋值,属于未初始化的野指针,解引用操作也会触发内存访问错误。
  • 额外隐含问题:头文件中直接写入函数实现,若后续多个C文件引用该头文件会触发重复定义报错;直接free(s->top)未遍历释放整条链表节点,会造成内存泄漏。
修复方案

1. 调用代码修复

#include <stdio.h>
#include <stdbool.h>
#include "mystack.h"

// main返回值规范为int
int main()
{
    stack *s = NULL;
    int *x;
    int val;
    bool res;

    s = create_stack();
    printf ("Enter value to push : ");
    // 修正scanf传参,传入val的地址
    scanf("%d", &val);
    res = push(s, &val);

    if (res) {
        // 从栈顶读取值给x,避免野指针
        x = peek(s);
        printf("...PUSHED %d IN STACK...\n", *x);
    } else {
        printf("...STACK OVERFLOW...\n");
    }
    // 释放所有节点再释放栈结构,避免内存泄漏
    while (s->top != NULL) {
        pop(s);
    }
    free(s);
    return 0;
}

2. 头文件优化(可选,解决多文件引用冲突)

将mystack.h中的函数实现移到单独的mystack.c文件,头文件仅保留类型定义和函数声明:

// mystack.h 内容
#ifndef MYSTACK_H
#define MYSTACK_H
#include <stdbool.h>

typedef struct Node{
    void *data;
    struct Node *next;
} node;

typedef struct Stack{
    node *top;
} stack;

bool push(stack *s, void *val);
void* pop(stack *s);
void* peek(stack *s);
node* create_node(void *val);
stack* create_stack(void);

#endif

原有函数实现全部放到mystack.c中,编译时同时编译主程序文件和mystack.c即可。

内容的提问来源于stack exchange,提问作者Akanksha Kejriwal

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.23 16:45:04