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

C语言函数内访问链表问题:跨函数访问链表失败排查

问题分析与解决方案

你遇到的问题本质是C语言的函数参数值传递机制导致的——当你把chars传递给letters函数的lst_ptr参数时,lst_ptr只是chars的一个副本。在letters函数里修改lst_ptr的指向(比如让它指向malloc出来的链表节点),只会改变这个副本的地址,不会影响主函数里chars的实际值,所以两者的内存地址自然不一样。

要实现让report函数能访问到letters里创建的链表,你有两种常用的解决办法:

方法一:使用指针的指针(二级指针)传递参数

通过传递指针的指针,函数就能直接修改原指针的指向。示例代码如下:

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

struct charact {
    char ch;
    int occurs;
    struct charact *next;
};
typedef struct charact CharNode;

// 使用二级指针作为参数
void letters(CharNode **lst_ptr) {
    // 创建第一个节点
    *lst_ptr = (CharNode *)malloc(sizeof(CharNode));
    if (*lst_ptr == NULL) {
        perror("malloc failed");
        exit(EXIT_FAILURE);
    }
    (*lst_ptr)->ch = 'a';
    (*lst_ptr)->occurs = 5;
    (*lst_ptr)->next = NULL;

    // 可以继续添加更多节点...
}

void report(CharNode *head) {
    CharNode *current = head;
    while (current != NULL) {
        printf("Character: %c, Occurrences: %d\n", current->ch, current->occurs);
        current = current->next;
    }
}

int main() {
    CharNode *chars = NULL;
    // 传递chars的地址(二级指针)
    letters(&chars);
    report(chars);

    // 记得释放链表内存,避免泄漏
    CharNode *temp;
    while (chars != NULL) {
        temp = chars;
        chars = chars->next;
        free(temp);
    }
    return 0;
}

方法二:让函数返回链表的头指针

让letters函数直接返回创建好的链表头节点地址,主函数接收这个返回值并赋值给chars:

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

struct charact {
    char ch;
    int occurs;
    struct charact *next;
};
typedef struct charact CharNode;

// 返回链表头指针
CharNode* letters() {
    CharNode *head = (CharNode *)malloc(sizeof(CharNode));
    if (head == NULL) {
        perror("malloc failed");
        exit(EXIT_FAILURE);
    }
    head->ch = 'b';
    head->occurs = 3;
    head->next = NULL;

    // 添加更多节点...
    return head;
}

void report(CharNode *head) {
    CharNode *current = head;
    while (current != NULL) {
        printf("Character: %c, Occurrences: %d\n", current->ch, current->occurs);
        current = current->next;
    }
}

int main() {
    CharNode *chars = letters();
    report(chars);

    // 释放内存
    CharNode *temp;
    while (chars != NULL) {
        temp = chars;
        chars = chars->next;
        free(temp);
    }
    return 0;
}

这两种方法都能让chars正确指向letters里创建的链表头节点,之后report函数就能正常遍历打印链表内容了。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.27 03:37:17