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

使用指针创建栈时触发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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.14 12:25:17