使用指针创建栈时触发Segmentation fault (Core Dump),求原因排查
段错误原因与修复方案
错误根源
你声明了struct stack *ptr;但未对其初始化,这个指针指向的是内存中的随机非法地址。当你尝试通过ptr->size修改该地址的内容时,操作系统会阻止程序访问未授权的内存,直接触发Segmentation Fault。
修复方案
有两种可行的修复方式:
方式1:为结构体指针分配堆内存
先通过malloc为ptr分配合法的堆内存空间,再操作其成员:
#include <stdio.h> #include <stdlib.h> struct stack { int size; int top; int *arr; }; int main(){ struct stack *ptr = (struct stack *)malloc(sizeof(struct stack)); // 检查内存分配是否成功 if (ptr == NULL) { printf("Failed to allocate memory for stack structure\n"); return 1; } ptr->size = 10; ptr->top = -1; ptr->arr = (int *)malloc(ptr->size * sizeof(int)); // 检查数组内存分配 if (ptr->arr == NULL) { printf("Failed to allocate memory for stack array\n"); free(ptr); // 提前释放结构体内存,避免泄漏 return 1; } // 此处可添加栈的操作逻辑 // 释放内存,避免泄漏 free(ptr->arr); free(ptr); return 0; }
方式2:直接使用栈上的结构体变量
如果不需要动态分配结构体,直接在栈上定义变量即可,无需指针:
#include <stdio.h> #include <stdlib.h> struct stack { int size; int top; int *arr; }; int main(){ struct stack s; s.size = 10; s.top = -1; s.arr = (int *)malloc(s.size * sizeof(int)); if (s.arr == NULL) { printf("Failed to allocate memory for stack array\n"); return 1; } // 此处可添加栈的操作逻辑 // 仅需释放数组内存 free(s.arr); return 0; }
注意事项
- 每次调用
malloc后必须检查返回值是否为NULL,防止内存分配失败引发后续错误。 - 使用堆内存时,务必在程序结束前释放所有分配的内存,避免内存泄漏。
内容的提问来源于stack exchange,提问作者Ritesh
相关产品推荐
相关产品推荐

