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
相关产品推荐
相关产品推荐

