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

VSCode运行链表求和代码出现Segmentation Fault,在线GDB却正常?

问题原因分析及修复方案

核心 Segmentation Fault 原因:未终止的链表

你的代码中最直接导致段错误的问题是链表没有正确终止。在main函数里,你创建了third1和third2节点,但没有将它们的next指针设置为NULL。这意味着:

  • 当遍历链表到third1时,temp1->next会指向一块未初始化的垃圾内存(不是NULL)
  • 循环条件temp1 != NULL && temp2 != NULL会继续成立,导致代码尝试访问temp1->val(无效内存地址),触发段错误

在线GDB能运行是因为部分在线环境的malloc会默认将分配的内存初始化为0,此时third1->next恰好是NULL,让循环正常终止。但这属于未定义行为,不可依赖。

其他代码问题

  1. 错误的free()调用:
    你在函数末尾调用free(temp1)和free(temp2),但这两个指针是传入链表的节点指针。直接释放它们会破坏原链表的内存,且如果链表长度不一致,可能会释放NULL以外的无效指针(虽然free(NULL)是安全的,但逻辑上完全错误)。

  2. 整数溢出风险:
    使用int类型存储l1sum、l2sum和i,当链表长度超过9个节点时,i会变成1e9,乘以节点值后很容易超出32位int的最大值(约2e9),导致溢出和未定义行为。

修复后的代码

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

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

void addTwoNumbers(struct ListNode* l1, struct ListNode* l2){
    // 使用long long避免整数溢出
    long long l1sum = 0, l2sum = 0;
    long long i = 1;
    struct ListNode * temp1 = l1;
    struct ListNode * temp2 = l2;
    
    while(temp1 != NULL && temp2 != NULL)
    {
        l1sum += temp1->val * i;
        l2sum += temp2->val * i;
        i = i * 10;
        temp1 = temp1->next;
        temp2 = temp2->next;
    }
    
    printf("l1sum: %lld\n", l1sum);
    printf("l2sum: %lld\n", l2sum);
}

int main()
{
    struct ListNode * head1 = (struct ListNode *)malloc(sizeof(struct ListNode));
    struct ListNode * head2 = (struct ListNode *)malloc(sizeof(struct ListNode));
    struct ListNode * second1 = (struct ListNode *)malloc(sizeof(struct ListNode));
    struct ListNode * second2 = (struct ListNode *)malloc(sizeof(struct ListNode));
    struct ListNode * third1 = (struct ListNode *)malloc(sizeof(struct ListNode));
    struct ListNode * third2 = (struct ListNode *)malloc(sizeof(struct ListNode));

    head1->val = 2;
    second1->val = 4;
    third1->val = 3;
    head1->next = second1;
    second1->next = third1;
    // 终止链表
    third1->next = NULL;

    head2->val = 5;
    second2->val = 6;
    third2->val = 4;
    head2->next = second2;
    second2->next = third2;
    // 终止链表
    third2->next = NULL;

    addTwoNumbers(head1, head2);
    
    // 记得释放所有链表节点,避免内存泄漏
    free(head1);
    free(second1);
    free(third1);
    free(head2);
    free(second2);
    free(third2);
    
    return 0;
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.22 10:25:05