| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 473 人关注过本帖
标题:【返回指针的函数】不明点
只看楼主 加入收藏
果沫
Rank: 8Rank: 8
等 级:蝙蝠侠
帖 子:198
专家分:960
注 册:2013-1-30
结帖率:100%
收藏
已结贴  问题点数:20 回复次数:7 
【返回指针的函数】不明点
程序代码:
#include <stdio.h>
int *fun(void)
{
    int a = 7;

    return &a;
}

int main()
{
    printf("%d\n",*fun());

    return 0;
}


我写了如上的一小段代码,在fun函数运行结束时返回局部变量a的地址,并在主函数中访问地址输出数据,但却不出错,成功输出7。

不是说函数中定义的局部变量都是保存在栈中,当函数结束时,其栈上的数据也会被销毁吗,为啥被销毁了还能在主函数中访问那段地址成功输出其中的数据。


[ 本帖最后由 果沫 于 2013-2-24 11:59 编辑 ]
2013-02-24 11:55
yuccn
Rank: 16Rank: 16Rank: 16Rank: 16
来 自:何方
等 级:版主
威 望:167
帖 子:6815
专家分:42393
注 册:2010-12-16
收藏
得分:10 
int 是基本数据类型,不想对象那样会销毁(析构),
用汇编看下就知道了,返回的时候,只是调整了一下堆栈指针而已,原来的数据还是原来的数据,不过如果返回到输出之间,如果你还有其他的函数调用,那么这块堆栈内存就被再次利用,这个时候可能就被冲掉了的。

不是说函数返回,里面的内存数据就一定改变,而是,再次利用这次内存的时候,才会被磨掉,



我行我乐
公众号:逻辑客栈
我的博客:
https://blog.yuccn. net
2013-02-24 12:16
Susake
Rank: 15Rank: 15Rank: 15Rank: 15Rank: 15
来 自:女儿国的隔壁
等 级:贵宾
威 望:23
帖 子:2288
专家分:6481
注 册:2012-12-14
收藏
得分:0 
其实你稍微想下就是了....指针函数返回地址,然后回到main()中,取地址的内容.....本质一样

仰望星空...........不忘初心!
2013-02-24 12:20
果沫
Rank: 8Rank: 8
等 级:蝙蝠侠
帖 子:198
专家分:960
注 册:2013-1-30
收藏
得分:0 
回复 2楼 yuccn
程序代码:
#include <stdio.h>
char *Func(void)
{
    char str[30] = {"wwww"};
    return str;
}

char *fun(void)
{
    char str[30] = {"fwef"};
    return str;
}


int main(void)
{
    printf("%c    %c\n",*fun(),*Func());
    return 0;
}


上面这样,返回到输出之间,并且还有其他函数的调用,还是会成功输出f和w啊QAQ....不太明白你说的啊
2013-02-24 12:25
果沫
Rank: 8Rank: 8
等 级:蝙蝠侠
帖 子:198
专家分:960
注 册:2013-1-30
收藏
得分:0 
回复 3楼 Susake
我知道-0- ,可是函数结束栈上的数据被销毁,应该是会访问出错的啊QAQ
2013-02-24 12:26
jokerskill
Rank: 7Rank: 7Rank: 7
等 级:黑侠
帖 子:392
专家分:554
注 册:2012-3-4
收藏
得分:0 
有价值
2013-02-24 13:48
果沫
Rank: 8Rank: 8
等 级:蝙蝠侠
帖 子:198
专家分:960
注 册:2013-1-30
收藏
得分:0 
QAQ
没人帮忙解释一下么
2013-02-24 13:57
信箱有效
Rank: 13Rank: 13Rank: 13Rank: 13
等 级:蒙面侠
威 望:9
帖 子:1102
专家分:4268
注 册:2012-6-19
收藏
得分:10 
有啥价值。

你这样写 编译器不会给你返回局部地址的警告吗?

这样简单的“函数”,编译器当作内联函数使用,
简单讲 就相当于在printf中计算*fun(),然后把结果PUSH进栈 当作是printf的参数一,然后再计算*Func(),把结果PUSH进栈 当作是参数二,然后printf。

最后虽然结果对 但是你也这样的用法是不安全的 为毛还要试呢。
2013-02-24 14:34
快速回复:【返回指针的函数】不明点
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.067150 second(s), 7 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved