链表内存创建可视化及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
相关产品推荐
相关产品推荐

