首页 新闻 会员 周边

c语言指针丢失?

0
[待解决问题]

我定义了如下数据结构,写了一个简单的指针传参的例子,没想到执行到了say函数的是时候,指针竟然丢失,不知道是什么原因,望大神指教?


typedef struct people
{
char* name;
int age;
}rq, *rq1;

void say(rq1* r)
{
rq1 q = *r;//指针到了这里就丢失了
printf("名字是:%s,年龄是:%d\n", q->name, q->age);
}

rq1* get()
{
rq1 q = (rq1)malloc(sizeof(rq));
q->name = "xx";
q->age = 20;
return &q;
}

int _tmain(int argc, _TCHAR* argv[])
{
rq1* a = get();
say(a);
return 0;
}

yeasinue的主页 yeasinue | 菜鸟二级 | 园豆:202
提问于:2014-11-02 00:21
< >
分享
所有回答(1)
0

rq1* get()
{
rq1 q = (rq1)malloc(sizeof(rq));
q->name = "xx";
q->age = 20;
return &q;
}

这个函数有误,由于你的命名不利于对代码的理解,所以我给你写成这样:

people ** get()
{
people * q = (people *)malloc(sizeof(people));
q->name = "xx";
q->age = 20;
return &q;
}

注意标红的语句,返回了栈内变量的地址,此地址在出了函数作用域后就失效了。

Launcher | 园豆:45045 (高人七级) | 2014-11-03 09:46

你好,既然栈内变量出了函数的作用域后就失效,为什么我调用get之后还能够成功地返回,并且还能够访问其中的内容,直到把其传入方法或解引用之后就失效了,如图:

支持(0) 反对(0) yeasinue | 园豆:202 (菜鸟二级) | 2014-11-03 21:25

@yeasincode: 这应该算是 C/C++ 编程,甚至是编程的基本原理性东西了。你是不是自学成才的?看下面这段代码:

people ** a = get();

people * b = *a;

printf("名字是:%s,年龄是:%d\n", b->name, b->age);

getchar();

请分别使用 DebugRelease 编译后运行,然后仔细观察屏幕输出的内容。

支持(0) 反对(0) Launcher | 园豆:45045 (高人七级) | 2014-11-04 09:43

@Launcher: 你好,是否可以告诉怎么操作,因为调试好多次,还没得出结论,确实栈内数据不会失效,你想一下,返回之后栈内变量消失了,但是变量所以引用的地址并没有丢失,即所引用的地址也不会丢失。按照你说的debug和release也看不出所以然!

支持(0) 反对(0) yeasinue | 园豆:202 (菜鸟二级) | 2014-11-04 17:56

@yeasincode: 祝您在 C++ 的道路上越走越远,再见!

支持(0) 反对(0) Launcher | 园豆:45045 (高人七级) | 2014-11-04 18:06
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册