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

C语言栈实现调用pop函数后出现Segmentation fault的原因排查

问题分析与解决

核心问题:isEmpty函数逻辑错误

你的isEmpty函数当前仅判断栈结构体指针q是否为NULL,但空栈的正确判断标准是栈的头指针q->head为NULL。

当你弹出第一个元素a后,栈内仍有b和c,第二次pop可正常弹出b;但弹出最后一个元素c后,q->head会被设为NULL。此时再次调用pop,isEmpty(q)会返回false(因为q本身不是NULL),代码继续执行Node* temp = q->head;,导致temp为NULL,后续访问temp->data直接触发段错误。

修正代码

1. 修正isEmpty函数

同时处理栈指针q本身为NULL的异常情况:

int isEmpty(Stack* q) {
    // 先判断栈指针合法性,再判断头指针是否为空
    return (q == NULL || q->head == NULL);
}

2. 可选:pop函数增加双重安全校验

在pop函数中额外校验temp是否为NULL,避免意外的空指针访问:

char* pop(Stack* q) {
    if (isEmpty(q)) {
        return NULL;
    }
    Node* temp = q->head;
    if (temp == NULL) {
        return NULL;
    }
    char* A = temp->data;
    q->head = temp->next;
    free(temp);
    return A;
}

补充说明

栈初始化时,必须确保Stack结构体的head成员被初始化为NULL,这样isEmpty才能正确识别空栈状态。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.18 09:33:14