You need to enable JavaScript to run this app. 船舶租赁库存程序按价格排序打印触发Segmentation Fault
优惠活动
大模型
产品
解决方案
定价
更多

船舶租赁库存程序按价格排序打印触发Segmentation Fault

段错误成因与代码修正方案

直接触发段错误的原因

头节点初始化的指针赋值方向完全写反,直接解引用空指针:

if(sorted->head == NULL){
  new = sorted->head; // sorted->head初始为NULL,执行完该行new被赋值为NULL
  new->next = NULL;  // 解引用空指针,直接触发段错误
}

此处本意是将新节点赋值给sorted->head,实际代码写成了把sorted->head赋值给new。

其他会导致逻辑错误/内存异常的问题

  • 内存泄漏+原链表结构破坏:先malloc生成新的watercraft_t节点后,下一行直接执行new = init,将新指针覆盖为原链表的节点指针,刚申请的内存直接丢失(内存泄漏),后续对节点指针的修改还会直接破坏原库存链表的结构。
  • 排序遍历指针使用错误:用于遍历已排序列表的temp、prev指针初始值为原链表的list->head,全程操作原链表节点,未对新建的sorted链表做任何插入操作,完全偏离“新建排序列表拷贝数据”的设计目标。
  • 插入逻辑不符合要求:未遍历新建的sorted链表匹配插入位置,仅靠原链表的temp->next判断插入位置,就算头节点逻辑修正,最终排序结果也会完全错误。

修正参考代码(深拷贝+插入排序实现)

list_t *sorted = (list_t*)malloc(sizeof(list_t));
if (!sorted) { /* 可自行补充malloc失败的异常处理 */ }
sorted->size = 0;
sorted->head = NULL;
sorted->tail = NULL;

watercraft_t *curr = list->head;
while (curr != NULL) {
    // 深拷贝原节点,避免修改原库存链表
    watercraft_t *new_node = (watercraft_t*)malloc(sizeof(watercraft_t));
    memcpy(new_node, curr, sizeof(watercraft_t));
    new_node->next = NULL;

    // 遍历已排序列表找到插入位置
    watercraft_t *pos_prev = NULL;
    watercraft_t *pos_curr = sorted->head;
    while (pos_curr != NULL && pos_curr->total_price < new_node->total_price) {
        pos_prev = pos_curr;
        pos_curr = pos_curr->next;
    }

    // 执行插入
    if (pos_prev == NULL) {
        // 插入到表头
        new_node->next = sorted->head;
        sorted->head = new_node;
    } else {
        // 插入到中间或表尾
        pos_prev->next = new_node;
        new_node->next = pos_curr;
    }

    // 更新表尾指针
    if (new_node->next == NULL) {
        sorted->tail = new_node;
    }
    sorted->size++;

    curr = curr->next;
}

注:如果不需要保留原链表结构,也可以直接对原链表做原地插入排序,无需额外申请新链表内存。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.31 04:24:03