关于C/C++的几个小问题,高手请进

siwenbailei2002 2007-04-15 01:27:45
1.关于子函数中的变量的问题:
eg:
a. char* getstr1(void)
{
char* s = "abcdef";
return s;
}
b. char* getstr2(void)
{
char s[] = {'a','b','c','d','e','f'};
return s;
}
问:这两种写函数的形式我在机子上都试过,现在不明白的是,a是对的,b不对。都说子函数中的变量是存贮在堆栈中的,在该函数调用完后,应该是自动消失,但为什么a(指针形式)就对呢?由此想到另外一个在C++中的问题:类abc的成员函数是这样写的:
abc abc:: operator + (const abc & m) const
{
abc temp;
...
return abc;
}
我同样不是很明白为什么这样可以,要是这样可以的话,那返回的temp也是局部变量啊,函数执行完后不就消失了么?为什么还能用?
请高手赐教!!!
...全文
379 12 打赏 收藏 转发到动态 举报
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
Benny_ywb 2007-04-17
  • 打赏
  • 举报
回复
呵呵,我也来顶下
liuy21 2007-04-17
  • 打赏
  • 举报
回复
也来顶一下
pallove 2007-04-17
  • 打赏
  • 举报
回复
A虽然是对的,但以后还是不要这样写。
JWILLOVE 2007-04-17
  • 打赏
  • 举报
回复
正在积极学习,有收获
siwenbailei2002 2007-04-16
  • 打赏
  • 举报
回复
谢谢大家了,看了大家的答复,好好体味下后,我现在对这类问题的很清楚了,长久的困惑终于解决了.谢谢~
guanwl 2007-04-16
  • 打赏
  • 举报
回复
A之所以能对不是因为指针. 而是因为常量.
"abcdef";是个常量. 在整个程序生命期都有效.
而a中返出的是指向这个常量的地址,当然是个有效指针了.
super_china 2007-04-16
  • 打赏
  • 举报
回复
看了有很大收获。
xxc028 2007-04-16
  • 打赏
  • 举报
回复
嘿嘿 有收获
不想低调 2007-04-15
  • 打赏
  • 举报
回复
lz看看这本书,高质量C++编程指南
xlbdan 2007-04-15
  • 打赏
  • 举报
回复
a里面的
char* s = "abcdef";
return s;
是对的,是因为s指向了一个字符串常量"abcdef",而字符串常量的生命期是程序级的,所以你返回它的指针s没有问题,不过这种作法不提倡。
你可以看林锐的书

b里面的
char s[] = {'a','b','c','d','e','f'};
return s;
的确是栈上的数组,对它的返回是不行的,因为函数结束它的生命就结束了,返回的只是一堆垃圾


至于你的疑问,
abc temp;
...
return abc; //这你写错了,应该是temp

它返回的的确是一个栈上的对象,但你要注意,你的返回类型是abc ,也就是说,是按值返回的,并不是按地址返回,所以在返回temp的时候,会调用拷贝构造函数重新生成一个新的abc的对象,所以没有问题。如果你也是按地址返回,例如
abc& abc:: operator + (const abc & m) const //返回类型是引用
{
abc temp;
...
return temp;
}
这就不行了,因为函数内的temp在函数结束死去,返回它的地址得到的将是垃圾
hellox 2007-04-15
  • 打赏
  • 举报
回复
那返回的temp也是局部变量啊,函数执行完后不就消失了么?为什么还能用?
======================================================================
返回的是值,又不是返回引用。。。
返回引用就不可以了。。
飞哥 2007-04-15
  • 打赏
  • 举报
回复
不要返回局部变量
局部变量是在栈上分配内存
当函数返回该空间就被释放

你第一个函数能够正确返回,是因为字符串常量分配在全局常量区
即使函数返回也不会去释放那个区
因此是对的

64,646

社区成员

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

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