| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 1703 人关注过本帖
标题:被调函数返回一个函数内部定义的变量的地址,此时这个地址对应的垃圾值能被 ...
只看楼主 加入收藏
TAAAAB
Rank: 7Rank: 7Rank: 7
来 自:湖南
等 级:黑侠
威 望:1
帖 子:243
专家分:635
注 册:2011-5-29
结帖率:95.24%
收藏
已结贴  问题点数:20 回复次数:17 
被调函数返回一个函数内部定义的变量的地址,此时这个地址对应的垃圾值能被还原吗?
下面这段代码被调函数返回了一个在自己内部定义的变量的地址。

我在想虽然内存被释放了,但是由于之前有为这块内存写入一个值
再用一个指针去指向这块内存的地址,读取所谓的垃圾值时是否还能还原之前的那个值?

用下面这段代码测试从结果看int类型被还原了,char类型也以可以。返回字符串为什么不行?

程序代码:
 #include <stdio.h>
#define LEN 8

int * f1(void);
char * f2(void);
char * f3(void);
int main(void)
{
    int n;
    char c;
    char *s;
    int i;
    
    n = *f1();
    printf("%d\n", n);
    
    c = *f2();
    printf("%c\n", c);

    s = f3();
    printf("%s\n", s);
    for(i = 0; i < LEN; i++)
        printf("%c\n", s[i]);
    
    return 0;
}    


int * f1(void)
{
    int a = 80;
    
    return  &a;
}   

char * f2(void)
{
    char b = 'w';
    return &b;
}  

char * f3(void)
{
    char j[LEN];
    int i;

    for (i = 0; i < LEN; i++)
        j[i] = i + '0';
    j[LEN -1] = '\0';
    
    return  j;
}   


[ 本帖最后由 TAAAAB 于 2015-3-19 16:33 编辑 ]
搜索更多相关主题的帖子: include 字符串 
2015-03-19 16:00
longwu9t
Rank: 11Rank: 11Rank: 11Rank: 11
等 级:小飞侠
威 望:6
帖 子:732
专家分:2468
注 册:2014-10-9
收藏
得分:4 
printf("%c\n", c);

Only the Code Tells the Truth             K.I.S.S
2015-03-19 16:11
TAAAAB
Rank: 7Rank: 7Rank: 7
来 自:湖南
等 级:黑侠
威 望:1
帖 子:243
专家分:635
注 册:2011-5-29
收藏
得分:0 
回复 2楼 longwu9t
大意了,代码更正过来了。但是字符数组还是不行?

人有多懒,编程就有多难。
2015-03-19 16:35
longwu9t
Rank: 11Rank: 11Rank: 11Rank: 11
等 级:小飞侠
威 望:6
帖 子:732
专家分:2468
注 册:2014-10-9
收藏
得分:0 
程序代码:
#include <stdio.h>
#define LEN 8

int * f1(void);
char * f2(void);
char *f3(void);
int main(void) {
    int i, n;
    char c;
    char *s = NULL;
    char str[LEN] = {0};

    n = *f1();
    printf("%d\n", n);

    c = *f2();
    printf("%c\n", c);

    s = f3();

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

    for(i = 0; i < LEN; i++) {
        str[i] = *(f3() + i);
    }

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

    return 0;
}


int * f1(void) {
    int a = 80;

    return  &a;
}

char * f2(void) {
    char b = 'w';
    return &b;
}

char * f3(void) {
    char *p = "1234567";
    return  p;
}

Only the Code Tells the Truth             K.I.S.S
2015-03-19 17:00
longwu9t
Rank: 11Rank: 11Rank: 11Rank: 11
等 级:小飞侠
威 望:6
帖 子:732
专家分:2468
注 册:2014-10-9
收藏
得分:0 
函数执行过后 常量存在数据段 不被新数据覆盖时可以被取回
变量存在堆栈上 必定被冲掉

我的理解不知道对不对 请大神指点

Only the Code Tells the Truth             K.I.S.S
2015-03-19 17:03
zklhp
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
来 自:china
等 级:贵宾
威 望:254
帖 子:11485
专家分:33241
注 册:2007-7-10
收藏
得分:4 
以下是引用longwu9t在2015-3-19 17:03:54的发言:

函数执行过后 常量存在数据段 不被新数据覆盖时可以被取回  
变量存在堆栈上 必定被冲掉  
 
我的理解不知道对不对 请大神指点


程序代码:
#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;
}

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


[ 本帖最后由 zklhp 于 2015-3-19 17:36 编辑 ]
2015-03-19 17:35
wube
Rank: 12Rank: 12Rank: 12
等 级:贵宾
威 望:23
帖 子:1820
专家分:3681
注 册:2011-3-24
收藏
得分:4 
不太懂是要做什么,照着做是这样
图片附件: 游客没有浏览图片的权限,请 登录注册


改一下变这样
图片附件: 游客没有浏览图片的权限,请 登录注册


因为在副程式声明的变量,跳出后就自动销毁,但是有把曾经存在过的地址传回来,只是销毁后的变量地址内资料已消失.
,所以循环出来的值都是乱码.我的理解不知道对不对 请大神指点

不要選我當版主
2015-03-19 17:41
wube
Rank: 12Rank: 12Rank: 12
等 级:贵宾
威 望:23
帖 子:1820
专家分:3681
注 册:2011-3-24
收藏
得分:0 
用逐行执行用内存监视器看,一跑完s = f3();往下一行时,该地址的资料就遗失了.

不要選我當版主
2015-03-19 17:44
lovegh
Rank: 5Rank: 5
来 自:图灵学院
等 级:职业侠客
威 望:3
帖 子:117
专家分:311
注 册:2015-1-23
收藏
得分:4 
回复 5楼 longwu9t
常年区的数据会被缓存所以那样确实可以输出。
局部变量在stack,我只知道它会被释放。
程序代码:
char * p = "123456";  // 字符串常量
char * p2 = "123456";  // p2 的地址和p一样,可以自己验证。
char p3[8] = "123456"; // 字符串变量,地址不一样。

别老是写代码,要多陪妹子,多了解老婆大人,血淋淋的教训。
2015-03-19 18:30
TAAAAB
Rank: 7Rank: 7Rank: 7
来 自:湖南
等 级:黑侠
威 望:1
帖 子:243
专家分:635
注 册:2011-5-29
收藏
得分:0 
以下是引用longwu9t在2015-3-19 17:00:46的发言:


char * f3(void) {
    char *p = "1234567";
    return  p;
}

你这里不一样是把字符串常量的地址发给了指针

人有多懒,编程就有多难。
2015-03-19 20:34
快速回复:被调函数返回一个函数内部定义的变量的地址,此时这个地址对应的垃圾值 ...
数据加载中...
 
   



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

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