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

C语言中栈结构体初始化时出现段错误(Segmentation Fault)求助

段错误原因及解决方法

你的段错误根源在于野指针访问:
struct stack *s; 仅声明了一个指向stack结构体的指针,但未给该指针分配任何有效内存空间,此时s是一个野指针,指向的内存地址是随机且不属于你的程序的。当执行s->size = 80时,你在尝试修改一块非法内存,直接触发了段错误。

解决方法一:为结构体指针分配堆内存

通过malloc为结构体指针分配有效内存,确保指针指向合法空间:

#include <stdio.h>
#include <stdlib.h>

struct stack
{
    int size;
    int top;
    int *arr;
};

int isEmpty(struct stack *ptr)
{
    return ptr->top == -1 ? 1 : 0;
}

int isfull(struct stack *ptr)
{
    return ptr->top == ptr->size - 1 ? 1 : 0;
}

int main()
{
    printf("Test\n");
    // 为结构体分配堆内存
    struct stack *s = (struct stack *)malloc(sizeof(struct stack));
    // 检查内存分配是否成功
    if (s == NULL) {
        printf("结构体内存分配失败\n");
        return 1;
    }
    s->size = 80;
    printf("Test\n");
    s->top = -1;
    // 为栈数组分配内存
    s->arr = (int *)malloc(s->size * sizeof(int));
    if (s->arr == NULL) {
        printf("栈数组内存分配失败\n");
        free(s); // 释放已分配的结构体内存,避免泄漏
        return 1;
    }
    printf("%d ", isEmpty(s));
    if (isEmpty(s))
    {
        printf("stack is empty");
    }
    else
    {
        printf("Not empty");
    }

    // 释放动态分配的内存,避免内存泄漏
    free(s->arr);
    free(s);

    return 0;
}

解决方法二:直接声明结构体变量(无需指针)

如果不需要动态管理结构体的生命周期,可以直接在栈上声明结构体变量,避免指针操作的风险:

#include <stdio.h>
#include <stdlib.h>

struct stack
{
    int size;
    int top;
    int *arr;
};

int isEmpty(struct stack *ptr)
{
    return ptr->top == -1 ? 1 : 0;
}

int isfull(struct stack *ptr)
{
    return ptr->top == ptr->size - 1 ? 1 : 0;
}

int main()
{
    printf("Test\n");
    // 直接声明结构体变量,内存分配在栈上
    struct stack s;
    s.size = 80;
    printf("Test\n");
    s.top = -1;
    s.arr = (int *)malloc(s.size * sizeof(int));
    if (s.arr == NULL) {
        printf("栈数组内存分配失败\n");
        return 1;
    }
    // 传入变量的地址给函数
    printf("%d ", isEmpty(&s));
    if (isEmpty(&s))
    {
        printf("stack is empty");
    }
    else
    {
        printf("Not empty");
    }

    // 释放数组内存
    free(s.arr);

    return 0;
}

注意事项

  • 使用malloc分配内存后,必须检查返回值是否为NULL,防止内存分配失败导致后续错误。
  • 动态分配的内存使用完毕后务必释放,避免内存泄漏。
  • 所有指针在使用前,必须确保它指向有效的内存空间,杜绝野指针访问。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.19 16:25:54