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

基于链表的队列内存释放出现段错误的原因及修复方法

段错误原因
  1. delete函数的致命问题:循环里先free(temp),下一次迭代要访问temp->next时,temp已经被释放成野指针,直接触发段错误。
  2. push函数的隐藏隐患:给字符串分配内存时只按strlen(word)的长度申请,没给字符串终止符'\0'预留空间,strcpy会越界写入内存,可能破坏堆结构,间接引发崩溃。
修复方法

修复delete函数

必须在释放当前节点前,先保存下一个节点的地址,避免释放后丢失遍历指针:

void delete(Queue *q) 
{
    Node *current = q->head;
    while (current != NULL) {
        Node *next_node = current->next; // 提前存好下一个节点的地址
        free(current->data);    
        free(current);
        current = next_node; // 用保存的指针推进遍历
    }
    free(q);
}

修复push函数的字符串内存分配

分配内存时多留1字节给字符串终止符'\0':

temp->data = malloc(strlen(word) + 1);

(注:sizeof(char)固定为1,可省略不写)

额外优化建议

每次调用malloc后最好检查返回值,防止内存分配失败导致后续操作出错,示例如下:

// 在push函数中,完成所有malloc操作后添加检查
if (*q == NULL || temp == NULL || temp->data == NULL) {
    // 清理已分配的内存,避免内存泄漏
    if (temp) {
        free(temp);
    }
    if (*q && (*q)->head == NULL) {
        free(*q);
        *q = NULL;
    }
    return;
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.13 12:55:19