回 帖 发 新 帖 刷新版面

主题:函数传值

请教
int* larger(int a,int b){
if(a>b)
return &a;
else
return &b;
}
为什么这样是错误的?返回不是制作副本嘛?跟变量有关系嘛》

int* larger(int *a,int *b){
if(*a>*b)
return a;
else
return b;
}
为什么是正确的?

回复列表 (共3个回复)

沙发

因为函数结束以后a和b就要被销毁了,你返回他们的地址自然就是不对的,因为指向的地址可能已经被写上别的值了。而传入指针的话虽然返回的变量事后被销毁了,但是传回调用函数的指针仍然指向他们应该指向的地方

具体一点就是
对于函数1
建立a和b的副本
使用这些副本变量
返回指向这个副本的指针
但是注意,返回以后因为函数结束了,所以副本变量的内存可以被其他地方占用了,于是你再用这个指针的时候可能就得到了错误的值

对于函数2
建立两个指针的副本
使用这些副本指针
返回一个指针的副本
这里注意,虽然指针是副本,事后要销毁这个副本,但是副本和原来的变量所指向的内存里的值是不发生变化的

板凳

[quote]因为函数结束以后a和b就要被销毁了,你返回他们的地址自然就是不对的,因为指向的地址可能已经被写上别的值了。而传入指针的话虽然返回的变量事后被销毁了,但是传回调用函数的指针仍然指向他们应该指向的地方

具体一点就是
对于函数1
建立a和b的副本
使用这些副本变量
返回指向这个副本的指针
但是注意,返回以后因为函数结束了,所以副本变量的内存可以被其他地方占用了,于是你再用这个指针的时候可能就得到了错误的值

对于函数2
建立两个指针的副本
使用这些副本指针
返回一个指针的副本
这里注意,虽然指针是副本,事后要销毁这个副本,但是副本和原来的变量所指向的内存里的值是不发生变化的[/quote]

精辟

3 楼


 太厉害了,有学到东西了,感谢!

我来回复

您尚未登录,请登录后再回复。点此登录或注册