船舶租赁库存程序按价格排序打印触发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
相关产品推荐
相关产品推荐

