关于C语言结构体指针的一个疑问?
如图,我写了一个结构体指针,但是发现在main函数和print函数中输出的同一个结点的num数据却是不一样,main函数中输出的是正确的1,而print函数中却输出了地址...
如图,我写了一个结构体指针,但是发现在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);}
展开
1个回答
展开全部
出现此问题的原因在于链表创建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;
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询