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

递归创建链表后打印出现Segmentation fault (core dumped)错误求助

递归创建链表出现无限输出与段错误的问题修复

你的代码核心问题是所有链表节点都在栈上分配局部变量,函数执行完毕后栈内存会被回收,导致指针指向无效内存,触发未定义行为(无限输出、段错误都是典型表现)。

具体错误点拆解

  • makeNode函数里创建的struct ListNode node是栈上局部变量,返回时会拷贝这个结构体,但node.next指向的也是栈上的变量(比如makeNodeFromList里的next),当外层函数返回后,这块内存已经失效,变成野指针。
  • makeNodeFromList中的struct ListNode next是局部变量,递归调用完成后赋值给它,但当makeNodeFromList返回时,next的内存被释放,你用&next作为参数传给makeNode,相当于让新节点的next指向一块已经被回收的内存。
  • 打印链表时,访问这些野指针会导致内存乱读,出现无限输出某个值,最终触发段错误。

修复方案:用动态内存分配创建节点

链表节点需要在堆上分配内存(用malloc),这样内存不会随函数返回释放,指针始终有效。

修正后的完整代码:

#include <stdio.h>
#include <stdlib.h>

struct ListNode {
    int val;
    struct ListNode *next;
};

// 动态创建单个节点
struct ListNode* makeNode(int val, struct ListNode* next) {
    struct ListNode* node = (struct ListNode*)malloc(sizeof(struct ListNode));
    if (node == NULL) { // 检查内存分配是否成功
        perror("malloc failed");
        exit(EXIT_FAILURE);
    }
    node->val = val;
    node->next = next;
    return node;
}

// 递归从数组创建链表,返回链表头指针
struct ListNode* makeNodeFromList(int arr[], int length, int index) {
    if (index == length) { // 基准条件:索引超出数组范围,返回NULL
        return NULL;
    }
    // 先创建后续节点,再让当前节点指向后续节点
    struct ListNode* nextNode = makeNodeFromList(arr, length, index + 1);
    return makeNode(arr[index], nextNode);
}

// 递归打印链表
void printNode(struct ListNode *l) {
    if (l == NULL) { // 先判断指针是否为空,避免访问空指针
        return;
    }
    printf("%d", l->val);
    if (l->next != NULL) {
        printf("\t");
        printNode(l->next);
    } else {
        printf("\n");
    }
}

// 释放链表内存,避免内存泄漏
void freeList(struct ListNode* head) {
    if (head == NULL) {
        return;
    }
    freeList(head->next);
    free(head);
}

int main() { 
    int arr[3] = {1,2,3};
    struct ListNode* head = makeNodeFromList(arr, 3, 0);
    printNode(head);
    freeList(head); // 释放内存
    return 0;
}

关键修改说明

  1. makeNode改为返回struct ListNode*指针,用malloc在堆上分配节点内存,确保内存持久有效。
  2. makeNodeFromList也改为返回指针,基准条件调整为index == length时返回NULL,逻辑更清晰。
  3. 打印函数先判断l是否为空,避免空指针访问。
  4. 添加freeList函数,递归释放链表内存,防止内存泄漏。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.06 19:55:32