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

