我定义了如下数据结构,写了一个简单的指针传参的例子,没想到执行到了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;
}
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;
}
注意标红的语句,返回了栈内变量的地址,此地址在出了函数作用域后就失效了。
你好,既然栈内变量出了函数的作用域后就失效,为什么我调用get之后还能够成功地返回,并且还能够访问其中的内容,直到把其传入方法或解引用之后就失效了,如图:
@yeasincode: 这应该算是 C/C++ 编程,甚至是编程的基本原理性东西了。你是不是自学成才的?看下面这段代码:
people ** a = get();
people * b = *a;
printf("名字是:%s,年龄是:%d\n", b->name, b->age);
getchar();
请分别使用 Debug 和 Release 编译后运行,然后仔细观察屏幕输出的内容。
@Launcher: 你好,是否可以告诉怎么操作,因为调试好多次,还没得出结论,确实栈内数据不会失效,你想一下,返回之后栈内变量消失了,但是变量所以引用的地址并没有丢失,即所引用的地址也不会丢失。按照你说的debug和release也看不出所以然!
@yeasincode: 祝您在 C++ 的道路上越走越远,再见!