基于链表的队列内存释放出现段错误的原因及修复方法
段错误原因
- delete函数的致命问题:循环里先
free(temp),下一次迭代要访问temp->next时,temp已经被释放成野指针,直接触发段错误。 - 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
相关产品推荐
相关产品推荐

