关于C语言结构体指针的一个疑问?

如图,我写了一个结构体指针,但是发现在main函数和print函数中输出的同一个结点的num数据却是不一样,main函数中输出的是正确的1,而print函数中却输出了地址值。后来我在print函数中添加了第18行的代码后,输出结果竟然都变成1了,这是怎么回事呢?求解答,代码贴下面:#include <stdio.h>struct student{ int num; struct student *next;};struct student* create(){ struct student b={2,NULL}; struct student a={1,&b}; struct student *head=&a; return head;}void print(struct student *head){ printf("%d\n",head); printf("%d",head->num);}int main(void){ struct student *head=create(); printf("%d\n",head->num); //1 print(head);}

出现此问题的原因在于链表创建create函数有问题,问题定位在图中红色框内。

此处每个节点使用的是局部变量,函数结束后,局部堆栈虽然内容不会清除,但内存会被回收,如果其它地方也使用堆栈可能会分给它用,内存内容就会改变。正确的方式是申请堆内存。使用malloc函数,同时包含头文件#include<stdlib.h>。

框内代码改成:

struct student *b = (struct student*)malloc(sizeof(struct student));

b->next = NULL;

b->num = 2;

struct student *a = (struct student*)malloc(sizeof(struct student));

a->next = b;

a->num = 1;

struct student *head=a;

温馨提示:答案为网友推荐,仅供参考
相似回答