关于return的问题

lzlilj 2010-01-14 04:48:22
#include<iostream>
using namespace std;
extern char test();
extern char *test1();
int main()
{
char b,*p3;
b=test();
cout<<b<<endl;
p3=test1();
cout<<p3<<endl;
system("SYSTEM");
}
char test()
{
char ptr[]={'a','b','c'};
char *p1=ptr;
return *p1;//正确的
}
char *test1()
{
char p2[]="abcd";
return p2;//编译时有警告
}


"return 不能返回指向栈内存的指针或者引用,因为该内存在函数体结束时被自动销毁"

对于这句话应该怎么理解呢, return *p1;也是存放在栈上的啊,还有如果返回一个值也是在栈上的啊,为什么就可以,请高手帮帮忙,谢谢大家
...全文
202 30 打赏 收藏 转发到动态 举报
写回复
用AI写文章
30 条回复
切换为时间正序
请发表友善的回复…
发表回复
mj2243 2010-01-15
  • 打赏
  • 举报
回复
。。。。。。。
多碰到几次就了解了
liubo_24020209 2010-01-15
  • 打赏
  • 举报
回复
各有说法啊
xinzhifan4 2010-01-14
  • 打赏
  • 举报
回复
我是来学习的
skyworth98 2010-01-14
  • 打赏
  • 举报
回复
能返回是因为返回值是一个指针,编译器无法检查合法性。
但是并不代表着你这么做就没有问题。

[Quote=引用楼主 lzlilj 的回复:]
#include <iostream>
using namespace std;
extern char test();
extern char *test1();
int main()
{
    char b,*p3;
    b=test();
    cout < <b < <endl;
    p3=test1();
    cout < <p3 < <endl;
    system("SYSTEM");
    }
char test()
{
    char ptr[]={'a','b','c'};
    char *p1=ptr;
    return *p1;//正确的
    }
char *test1()
{
    char p2[]="abcd";
    return p2;//编译时有警告
    }


"return 不能返回指向栈内存的指针或者引用,因为该内存在函数体结束时被自动销毁"

对于这句话应该怎么理解呢, return *p1;也是存放在栈上的啊,还有如果返回一个值也是在栈上的啊,为什么就可以,请高手帮帮忙,谢谢大家
[/Quote]
asksgp 2010-01-14
  • 打赏
  • 举报
回复
char test()
char *test1()
主要是2个返回的类型不一样,前个可以返回空字符串,后者是指针,指向的对象被销毁就出问题了。。。
借我那把枪吧 2010-01-14
  • 打赏
  • 举报
回复
明白这一点:

两个函数都返回了值,只不过一个是指针,一个是字符

说的很明白了啊,两个函数一样的,都返回值了啊
lzlilj 2010-01-14
  • 打赏
  • 举报
回复
谢谢谢谢大家,明白了,散分了
selooloo 2010-01-14
  • 打赏
  • 举报
回复
test() 返回的是一个具体的值,‘a’
test1() 返回的是个指针
return 不能返回指向栈内存的指针或者引用,所以test1有警告

注意,返回值一般放在寄存器里,test()结果后会把'a'放在寄存器里,b=test()是从寄存器里取值,不是从栈里取值。
test1()也同样把返回值放在寄存器里,寄存器里是个数组地址p2, p3=test1(); 是把栈的一个地址返回给p3,以上都是合法的;但如想通过p3取栈里值,就是非法的了,因为所指向的内容多半是被销毁了,所以提出警告

lzlilj 2010-01-14
  • 打赏
  • 举报
回复
[Quote=引用 20 楼 pur_e 的回复:]
问题不是指针被销毁了

C/C++ codechar fun()
{char c='a';return c;
}
。。。//调用char cc=fun();

这里,局部变量c先赋值给cc,然后被销毁

如果是指针:
C/C++ codechar*fun()
{char c='a';char*p=&a;return p;
}
。。。//调用char*pp=fun();

这个,指针p的值也是先赋值给pp,然后p销毁,过程都是一样的
错误在于局部变量c也被销毁了,就是说指针指向的值被销毁了,
错误是由指针指向的值被销毁引起的,不是指针被销毁引起的
[/Quote]

明白了,谢谢,有好多问题只是编译器就是这么规定的,哎,C++学起来东西真是多啊,每天真是累啊
pur_e 2010-01-14
  • 打赏
  • 举报
回复
有一处写错了

char *p=&a;

应该是

char *p=&c;
pur_e 2010-01-14
  • 打赏
  • 举报
回复
问题不是指针被销毁了


char fun()
{
char c='a';
return c;
}
。。。
//调用
char cc=fun();


这里,局部变量c先赋值给cc,然后被销毁

如果是指针:

char *fun()
{
char c='a';
char *p=&a;
return p;
}
。。。
//调用
char *pp=fun();



这个,指针p的值也是先赋值给pp,然后p销毁,过程都是一样的
错误在于局部变量c也被销毁了,就是说指针指向的值被销毁了,
错误是由指针指向的值被销毁引起的,不是指针被销毁引起的
lzlilj 2010-01-14
  • 打赏
  • 举报
回复
return是先返回值,然后销毁是吗
flyerwing 2010-01-14
  • 打赏
  • 举报
回复
好象存储分为动态存储跟静态存储还有程序存储的
具体偶也么知了,学校学了点菜的不能再菜的东西。
pur_e 2010-01-14
  • 打赏
  • 举报
回复
错误就是你用指针指向了一处被销毁的内存

指针的值哪来的

函数返回来的
lzlilj 2010-01-14
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 pur_e 的回复:]
是的,数组是被销毁了,但返回的是一个char类型字符

举个例子:
C/C++ codechar fun()
{char c='a';return c;
}//这个是可以的吧,你的那个函数跟这个一样
[/Quote]

你的意思是说return的时候是先返回值,再销毁是吗,对于指针或者引用,返回了地址值后,其值已经销毁了,就不可用了
lzlilj 2010-01-14
  • 打赏
  • 举报
回复
我问的这个问题不是必须用这个方法来做一些什么东西,我只是想知道为什么这样是错的

用static是可以返回,是因为static作用域问题,函数返回后变量不会消失
pur_e 2010-01-14
  • 打赏
  • 举报
回复
明白这一点:

两个函数都返回了值,只不过一个是指针,一个是字符

说的很明白了啊,两个函数一样的,都返回值了啊
lzlilj 2010-01-14
  • 打赏
  • 举报
回复
我知道指针是指向一块地址空间,返回时地址空间被销毁了,也就是指针指向一块不可用的地方,这个我知道
我只是不知道在返回那个点上,为什么值就可以返回,你们解释的我都知道,还是没有说的太明白,还有我不是GG,我是MM,呵呵
flyerwing 2010-01-14
  • 打赏
  • 举报
回复
return *p2
或者在P2定义是用静态存储的
wangchentangjuan 2010-01-14
  • 打赏
  • 举报
回复
*p1是一个数 p2是一个指针 你返回一个已经被销毁的地址当然会挂掉
加载更多回复(10)

64,647

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧