C++返回值和传参的区别??

nizainade 2010-07-16 11:03:04
参加笔试,不太清楚题目了,大概是下面这个样子:

char* test(void)
{
char * p = "hello world";
return p;
}



int main(int argc,char** argv)
{
char * pLocal = NULL;
pLocal = test();

cout<<pLocal<<endl;

}

问输出什么?


我当时答的是hello world,然后面试我的人说栈内存被释放,输出没东西,我试了下,确实输出hello world

不过我倒有些糊涂了。。 按道理讲test函数里p确实是栈内存,函数返回也应该释放。。。

请问各位高手,如果test是有个char*的参数肯定是不能返回hello world的,但是做为返回值就能返回,这两者什么区别??
...全文
204 19 打赏 收藏 转发到动态 举报
写回复
用AI写文章
19 条回复
切换为时间正序
请发表友善的回复…
发表回复
e_sharp 2010-07-17
  • 打赏
  • 举报
回复
这个面试官也太水了
qiutian1949 2010-07-17
  • 打赏
  • 举报
回复
strig fun(int x,int &y,int *z)
{
...
}
int a=1;
int b=2;
int *c=3;
string fd = fun(a,b,c)

a的值是进行的值传递,所以fun里的X再怎么改变fun执行完后,a还是1,只是在调用时把它的值复制一份给了函数
b进行的是引用,即相当于同名,或者说是小名,指的是同一个东西,fun函数里对Y的操作,都会同步体现在b上
c进行的是地址值的值传递,所以c和z指向的是同一块内存,对*z操作等同于对*c的操作.但是与上面不同的是,z不等于C,Z是一个指针,可以修改它的指针值,当它指向别处时,*z的修改就和*C的值没有关系了
晨星 2010-07-17
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 nizainade 的回复:]
那请问,char* 作为返回值是否肯定能传回值的??因为我们知道char* 作为参数的话不会返回值的
[/Quote]
参数是把值传入函数,返回值是把值从函数中传出,当然不一样了。
arong1234 2010-07-17
  • 打赏
  • 举报
回复
即使在栈上往往也是没有问题的,一块内存被写入之后,除非另外有内存写入,内容会维持不变的。虽然那个内存是临时的,只要没有其他人去覆盖它所在的内存,就没有问题。

我们说“不能返回临时变量的指针或者引用”是指那个对象的存在可能随时被破坏,并不是说你立刻就用也有问题,至少不是每种情况都会有问题。所以这个测试用例本身就不是一个好的例子
[Quote=引用 1 楼 mymtom 的回复:]
看看汇编就明白了, p在栈上不假,但是"hello world"不在栈上。
面试你的哪里是人啊!

C/C++ code

#include <stdio.h>

char* test(void)
{
char * p = "hello world";
return p;
}

int main(int argc,char** argv)
……
[/Quote]
nizainade 2010-07-17
  • 打赏
  • 举报
回复
也有可能是我记错题目了,允许冤枉别人了。。不管怎样,现在清楚了,感谢各位!
cs_yagami 2010-07-17
  • 打赏
  • 举报
回复
大概面試官認為* = []吧....
机智的呆呆 2010-07-17
  • 打赏
  • 举报
回复
如果面试你是一个大叔级(40岁+)的人,而且已经不写代码很多年了~~~~
那么他的结论也是有据可查的,比较老的编译器字符串确实放在栈,没有放在一个字符串常量区
他说的话对应当时编译器也是成立的~~

但是如果面试官在还在一线写代码得出以上的结论的话,那只能说面试官比较水
arfee_07 2010-07-17
  • 打赏
  • 举报
回复
这有更详细解释
http://blog.csdn.net/xcyuzhen/archive/2009/09/11/4543264.aspx
liutengfeigo 2010-07-16
  • 打赏
  • 举报
回复
楼主其实很有天赋嘛~
nizainade 2010-07-16
  • 打赏
  • 举报
回复
哦 大概明白了,就是说 char p[] = "hello world"是把常量区的"hello world"赋值给p
而 char*p ="hello world"是把P指向常量区的"hello world",两个不一样的。。。
liutengfeigo 2010-07-16
  • 打赏
  • 举报
回复
不要返回局部变量的指针或引用!
liutengfeigo 2010-07-16
  • 打赏
  • 举报
回复
如果你这样char p[] = "hello world"; 申请的话是在局部的栈上申请的内存。
当函数调用完了之后之后,就释放掉了。
老师上课时经常提到的啊
nizainade 2010-07-16
  • 打赏
  • 举报
回复
当然如果是
char p[] = "hello world";
return p;
就有问题了

请问 为什么char p[]就不行了??
liutengfeigo 2010-07-16
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 nizainade 的回复:]

那请问,char* 作为返回值是否肯定能传回值的??因为我们知道char* 作为参数的话不会返回值的
[/Quote]
不晓得你问什么
liutengfeigo 2010-07-16
  • 打赏
  • 举报
回复
面试官比大一的还菜,不解释。
nizainade 2010-07-16
  • 打赏
  • 举报
回复
那请问,char* 作为返回值是否肯定能传回值的??因为我们知道char* 作为参数的话不会返回值的
晨星 2010-07-16
  • 打赏
  • 举报
回复
字面字符串存在常量区,不在栈上,返回的p只是指向它而已。
这跟占据栈内存的
char p[] = "hello world";
是不一样的。

这个面试官也太水了吧。
mymtom 2010-07-16
  • 打赏
  • 举报
回复
当然如果是
char p[] = "hello world";
return p;
就有问题了
mymtom 2010-07-16
  • 打赏
  • 举报
回复
看看汇编就明白了, p在栈上不假,但是"hello world"不在栈上。
面试你的哪里是人啊!

#include <stdio.h>

char* test(void)
{
char * p = "hello world";
return p;
}

int main(int argc,char** argv)
{
char * pLocal = NULL;
pLocal = test();

printf("%s\n", pLocal);

return 0;
}


.file "demo.c"
.section .rodata
.LC0:
.string "hello world"
.text
.p2align 4,,15
.globl test
.type test, @function
test:
.LFB3:
pushq %rbp
.LCFI0:
movq %rsp, %rbp
.LCFI1:
movq $.LC0, -8(%rbp)
movq -8(%rbp), %rax
leave
ret
.LFE3:
.size test, .-test
.p2align 4,,15
.globl main
.type main, @function
main:
.LFB4:
pushq %rbp
.LCFI2:
movq %rsp, %rbp
.LCFI3:
subq $32, %rsp
.LCFI4:
movl %edi, -20(%rbp)
movq %rsi, -32(%rbp)
movq $0, -8(%rbp)
call test
movq %rax, -8(%rbp)
movq -8(%rbp), %rdi
call puts
movl $0, %eax
leave
ret
.LFE4:
.size main, .-main
.section .eh_frame,"a",@progbits
.Lframe1:
.long .LECIE1-.LSCIE1
.LSCIE1:
.long 0x0
.byte 0x1
.string "zR"
.uleb128 0x1
.sleb128 -8
.byte 0x10
.uleb128 0x1
.byte 0x3
.byte 0xc
.uleb128 0x7
.uleb128 0x8
.byte 0x90
.uleb128 0x1
.align 8
.LECIE1:
.LSFDE1:
.long .LEFDE1-.LASFDE1
.LASFDE1:
.long .LASFDE1-.Lframe1
.long .LFB3
.long .LFE3-.LFB3
.uleb128 0x0
.byte 0x4
.long .LCFI0-.LFB3
.byte 0xe
.uleb128 0x10
.byte 0x86
.uleb128 0x2
.byte 0x4
.long .LCFI1-.LCFI0
.byte 0xd
.uleb128 0x6
.align 8
.LEFDE1:
.LSFDE3:
.long .LEFDE3-.LASFDE3
.LASFDE3:
.long .LASFDE3-.Lframe1
.long .LFB4
.long .LFE4-.LFB4
.uleb128 0x0
.byte 0x4
.long .LCFI2-.LFB4
.byte 0xe
.uleb128 0x10
.byte 0x86
.uleb128 0x2
.byte 0x4
.long .LCFI3-.LCFI2
.byte 0xd
.uleb128 0x6
.align 8
.LEFDE3:
.ident "GCC: (GNU) 4.2.1 20070719 [FreeBSD]"

64,647

社区成员

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

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