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

链表内存创建可视化及C语言动态内存分配代码细节问询

堆内存创建链表的C代码执行细节解答

先贴出你提到的代码(注意:代码里存在大小写不一致问题,Last和定义的last指针需统一,C语言区分大小写):

struct Node
{
    int data;
    struct Node *next;
}*First = NULL;

int A[] = {2, 3, 5, 7, 10};

int main()
{
    struct Node *t, *last;
    First = (struct Node *)malloc(sizeof(struct Node));
    First->data = A[0];
    First->next = NULL;
    last = First;

    for(int i = 1; i < 5; i++)
    {
        t = (struct Node*)malloc(sizeof(struct Node));
        t->data=A[i];
        t->next=NULL;
        last->next=t;
        last=t;
    }
}

你的疑问逐个解答:

  • First初始化为NULL时的存储问题:
    First是全局指针变量,初始化为NULL意味着这个指针本身的值是NULL(对应内存地址0),此时它根本没有指向任何有效的Node结构体内存。你不能访问First->data或First->next,这属于非法内存操作,会触发报错。只有执行malloc分配内存后,First才指向堆上一块Node大小的有效内存,这时才能给结构体的data和next成员赋值。

  • last = First的含义:
    这行代码是让指针last和First指向同一块内存地址,不是复制结构体里的data和next值。换句话说,两个指针现在共享同一个Node结构体实例,所以此时last->data就是2,last->next是NULL,但这不是因为复制了值,而是它们指向同一个内存块。

  • 循环中last->next=t的作用:
    第一次循环时,t是新malloc出来的Node,t->data确实是3,t->next是NULL。last->next=t的核心作用是把当前链表的最后一个节点(last指向的节点)的next指针指向新创建的t节点,这样就把新节点链接到了链表的末尾,让链表长度增加1。之后last=t是把last更新为新的末尾节点,方便下一次循环继续链接下一个新节点。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.04 22:22:18