| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 1703 人关注过本帖
标题:被调函数返回一个函数内部定义的变量的地址,此时这个地址对应的垃圾值能被 ...
只看楼主 加入收藏
TAAAAB
Rank: 7Rank: 7Rank: 7
来 自:湖南
等 级:黑侠
威 望:1
帖 子:243
专家分:635
注 册:2011-5-29
收藏
得分:0 
以下是引用zklhp在2015-3-19 17:35:02的发言:




#include <stdio.h>

int *ret_stack_var(void)
{
    int tmp = 0;
    return &tmp;
}

int main(void)
{
    int *get_dangling_pointer = ret_stack_var();
    scanf("%d", get_dangling_pointer);
    printf("%d\n", *get_dangling_pointer);
    return 0;
}

会被冲掉 但不是【必定】被冲掉 更不是马上被冲掉

试了一下这段代码,为什么输入数字就出错,输入字符就可以通过?

人有多懒,编程就有多难。
2015-03-19 20:36
TAAAAB
Rank: 7Rank: 7Rank: 7
来 自:湖南
等 级:黑侠
威 望:1
帖 子:243
专家分:635
注 册:2011-5-29
收藏
得分:0 
先不考虑内存释放后是否被新的数据冲掉。假设没有被新的数据冲掉,那么通过函数f3返回的地址,能不能再重现f3中定义的字符串呢?

人有多懒,编程就有多难。
2015-03-19 20:40
wube
Rank: 12Rank: 12Rank: 12
等 级:贵宾
威 望:23
帖 子:1820
专家分:3681
注 册:2011-3-24
收藏
得分:0 
以下是引用TAAAAB在2015-3-19 20:40:42的发言:

先不考虑内存释放后是否被新的数据冲掉。假设没有被新的数据冲掉,那么通过函数f3返回的地址,能不能再重现f3中定义的字符串呢?


1.建立一個全局字符串數組,在f3處理時存一份進去。
2.主程式聲明一個字符串數組,跟著f3傳入再返回。
3.等待高人指示。

不要選我當版主
2015-03-19 22:30
TAAAAB
Rank: 7Rank: 7Rank: 7
来 自:湖南
等 级:黑侠
威 望:1
帖 子:243
专家分:635
注 册:2011-5-29
收藏
得分:0 
看来问题只能靠慢慢学习了,了解多了总会明白的。

人有多懒,编程就有多难。
2015-03-21 17:57
TonyDeng
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:304
帖 子:25859
专家分:48889
注 册:2011-6-22
收藏
得分:4 
研究不確定行爲,想得到什麽結論?

授人以渔,不授人以鱼。
2015-03-21 21:19
TAAAAB
Rank: 7Rank: 7Rank: 7
来 自:湖南
等 级:黑侠
威 望:1
帖 子:243
专家分:635
注 册:2011-5-29
收藏
得分:0 
回复 15楼 TonyDeng
没有弄清不确定的原因,想知道计算机内部是怎样运作导致的不确定。既然不确定,那么在什么情况下行?能否有方法去验证。

人有多懒,编程就有多难。
2015-03-22 09:32
TonyDeng
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:304
帖 子:25859
专家分:48889
注 册:2011-6-22
收藏
得分:0 
自動數據,存放於棧上,在生命期外隨時被程序後續操作覆蓋,隨時的意思,是可能會也可能不會,視後續代碼和自動數據是否會用到這部分空間而定,而那是不確定的。當時在棧上分配的數組,是一段空間,在作用期後,可能是一部分被重用,還有另一部分殘存,這也是説不定的。你的測試操作,無論結果怎樣,都無法成爲規律,這就是書上說不要返回和使用局部變量的意思——但返回在堆上分配的數據是可以的,即可以返回用malloc()之類函數申請的指針用於引用其指向的數據。

授人以渔,不授人以鱼。
2015-03-22 12:06
TonyDeng
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:304
帖 子:25859
专家分:48889
注 册:2011-6-22
收藏
得分:0 
你11樓的代碼,是返回棧上局部空間的入口地址,然後在後續操作中對這段地址填入數據,這裏的問題就在那段空間是否已經被別的東西用了,這樣做,要麽覆蓋別人的數據,要麽是破壞某些函數的環境(函數的調用要壓棧退棧,尤其是遞歸函數,更是大量的佔用棧空間記憶每一次調用的環境),要麽是僥幸成功,所以是不可取的,也沒歸納意義。

授人以渔,不授人以鱼。
2015-03-22 12:36
快速回复:被调函数返回一个函数内部定义的变量的地址,此时这个地址对应的垃圾值 ...
数据加载中...
 
   



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

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