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币。复制、灌水、广告等回答会被删除,是时候展现真正的技术了!
其他相关推荐
从内存分配角度分析c和java里的static 关键字.
即使作为Java的初学者, 对this 和 static 这两个关键字都不会陌生. 其实也不难理解:     this 关键字:  指的是对象的本身(注意不是类本身)  跟.net 语言的Me 关键字类似.     static 关键字: 静态分配的对象或对象成员.  也就是指被static 修饰的成员只属于类本身, 而不会想其他成员一样会对每个对象单独分配.     但是c语言也有st
一个结构体传递方式的问题
结构体做函数参数有两种传递方式: 一是传递结构体变量,这是值传递; 二是传递结构体指针,这是地址传递。 struct key_number { uint8 last; uint8 current; }; struct key_number keynum; 前几天犯了一个失误,在传递结构体变量时使用值传递,由于在函数中修改的是局部变量,导致函数外的全局变量没被修改到
C语言根据结构体成员变量的地址,得到结构体的地址
转自  http://blog.csdn.net/hwz119/article/details/1626537,作者:
C语言函数值传递与地址传递理解
先举个简单例子: #include using namespace std; void Add1(int *a) { (*a)++; } void Add2(int a) { a++; } int main() { int x=1,y=5; Add1(&x); Add2(y); cout<<x<<" "<<y<<endl; return 0;
对于结构体,什么时候分配内存以及为什么选择用malloc函数来分配结构体变量的地址
我们都知道结构体的定义: struct Node{     int score;     int age;     char sex; }sqlist; 这样一组结构体定义。 那先说说C语言中定义和声明的区别吧:     首先:声明是指定一个变量的标识符号,比如int a;                           定义是对声明的实例化,一定会分配内存空间。sqli
C语言参数传递----值传递与地址传递
最近开始复(yu)习(xi)C语言,看到参数传递这里,又遇到了以前一直没有搞清楚的一个问题,我相信这个问题大家许多初学者也会遇到过,就是C语言函数的参数传递方式。 C语言中参数的传递有两种方式: 1)值传递 2)地址传递 3)数组作为函数参数
C语言中结构体参数变量的传递
【文章摘要】       在C语言中,结构体参数变量经常作为函数的参数来进行传递。但如果参数设置不当,会出现内存问题。       本文以实际的程序代码为例,详细地介绍如何正确地使用结构体参数变量,为相关的开发工作提供了参考。【关键词】       C语言  结构体  函数  参数  传递 一、前言       本文中的程序实现对员工信息结构体字段赋值并打印出来的功能。该结构体的定义如下:// 员
指针的值传递和地址传递
值传递: 形参是实参的拷贝,改变形参的值并不会影响外部实参的值。从被调用函数的角度来说,值传递是单向的(实参->形参),参数的值只能传入, 不能传出。当函数内部需要修改参数,并且不希望这个改变影响调用者时,采用值传递。 指针传递: 形参为指向实参地址的指针,当对形参的指向操作时,就相当于对实参本身进行的操作 指针传递的实质: 指针传递参数本质上是值传递的
C语言关于结构体做参数传递
水平有限,谈谈自己的看法 首先结构体
通过结构体成员的地址获取结构体变量的地址
C 语言的结构体可以将不同类型的对象聚合到一个对象中,在内存中,编译器按照成员列表顺序分别为每个结构体变量成员分配内存,但由于 C 的内存对齐机制以及不同机器间的差异,各个成员之间可能会有间隙,所以不能简单的通过成员类型所占的字长来推断其它成员或结构体对象的地址。 如果要计算结构体中某成员相对于该结构体首地址的偏移量,一般第一个反应就是该成员的地址与结构体对象的首地址之间的字节数,就比如我定义了