2 shenhuan111 shenhuan111 于 2016.09.15 16:38 提问

C/C++为什么结构体在函数中通过 地址传递,怎么输出地址不对,麻烦从内存角度分析

C/C++为什么结构体在函数中通过 地址传递,怎么输出地址不对 printf("top:%d\n",top);,麻烦从内存角度分析
#include
#include
struct node{
int data;
struct node *next;
};
struct stack{
struct node *top;
};
void push_l(struct node *s,int val)
{
struct node *p=(struct node *)malloc(sizeof(struct node));
p->data=val;
p->next=s;
s=p;
printf("s:%d,p:%d\n",s,p);
}

void main()
{
struct node top;
push_l(&top,3);
printf("top:%d\n",top);
printf("s.data:%d\n",top.data);
system("pause");
}

2个回答

caozhy
caozhy   Ds   Rxr 2016.09.15 23:50
 void push_l(struct node *s,int val)
你传入的是地址,所以,对于变量来说,你可以修改(给结构体字段赋值,作用到实参),但是你指向新的地址,不会作用到实参。要改变地址作用到实参,需要地址的地址。

->
void push_l(struct node **s,int val)

s=p; -> *s=p;

struct node *top;
push_l(&top,3);
Lmikic
Lmikic   2016.09.16 16:59

这段代码的关键问题在于题主是在子函数中申请空间。在子函数中申请空间,并且从入口参数中返回所申请空间的地址,必然会出问题。首先说下原因:在主函数中的struct node top;只是定义了一个结构体top,并没有对它进行初始化,即top的地址是随机的。虽然题主在push_l(&top,3);中加了地址符,但是还是没有改变top是随机地址这一事实。在子函数中void push_l(struct node *s,int val),形参s会复制top的地址,这时它们还是一样的,然而p->next=s;s=p;改变了s的地址,此时top地址为p的下一个地址,s变成了p,可以看出咱们的top没有和s保持一致,这就是问题的所在。楼上的解决办法很好,赞一个。

Csdn user default icon
上传中...
上传图片
插入图片
准确详细的回答,更有利于被提问者采纳,从而获得C币。复制、灌水、广告等回答会被删除,是时候展现真正的技术了!