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

C语言链表传参问题:函数内节点值正确返回main后变0如何解决

问题根因

你的代码核心问题是链表节点存储的是栈变量的指针,而非实际数值,执行流程触发了指针指向内容被意外修改的问题:

  • 调用insertStart(&list, &displayNum)时,你把main函数中栈变量displayNum的地址传给了插入函数
  • insertStart内直接将这个地址赋值给了newNode->data,此时节点的data指针和displayNum指向同一块栈内存
  • 函数内打印时还未修改displayNum的值,所以输出正常
  • 回到main后你执行了displayNum = 0;,直接修改了data指针指向的内存内容,后续解引用打印自然就得到0
修复方案

你可以根据链表的设计需求选择任意一种方案:

方案1:修改链表节点存储实际数值(更推荐,实现简单无额外内存管理负担)

修改LinkedListNode结构体定义,将data字段从int*类型改为int类型:

// 修改前结构体示例
typedef struct LinkedListNode {
    int* data;
    struct LinkedListNode* next;
} LinkedListNode;
// 修改后
typedef struct LinkedListNode {
    int data;
    struct LinkedListNode* next;
} LinkedListNode;

同步修改插入函数逻辑:

// 参数改为直接传int值,也可以保留传指针后解引用赋值
void insertStart(LinkedList * list, int calcData)
{
    LinkedListNode* newNode = (LinkedListNode*)malloc(sizeof(LinkedListNode));
    newNode->data = calcData; // 直接存值,和原变量无关联
    newNode->next = list->head;
    list->head = newNode;
    printf("Node value inside function: %d\n", list->head->data);    
}

main函数调用时改为直接传值:

insertStart(&list, displayNum);  

方案2:保留指针存储,为数值单独申请堆内存

如果你的链表设计需要兼容多类型数据必须存指针,就需要给data指向的内容单独申请堆内存,避免和栈变量绑定:

void insertStart(LinkedList * list, int* calcData)
{
    LinkedListNode* newNode = (LinkedListNode*)malloc(sizeof(LinkedListNode));
    // 给data单独申请堆内存
    newNode->data = (int*)malloc(sizeof(int));
    // 把数值拷贝到堆内存中,和原栈变量脱离关联
    *(newNode->data) = *calcData;
    newNode->next = list->head;
    list->head = newNode;
    printf("Node value inside function: %d\n", *(list->head->data));    
}

注意:使用该方案时,删除节点需要先释放data指向的堆内存,再释放节点本身,否则会出现内存泄漏。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.27 21:36:03