| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 677 人关注过本帖
标题:偷梁换柱_局部变量
只看楼主 加入收藏
尝鲜
Rank: 2
等 级:论坛游民
帖 子:24
专家分:12
注 册:2010-10-21
结帖率:100%
收藏
已结贴  问题点数:10 回复次数:8 
偷梁换柱_局部变量
程序代码:
#include <stdio.h>
#include <string.h>
char *aa()
{
    int i=0;
    char s[]="abababababaabababbab";
    return s;
}
int main()
{
    char *p,p2[30];
    int i=0;
    p=aa();
    for(i=0;p[i]!='\0';i++)
        p2[i]=p[i];
    p=0;
    p2[i]='\0';
    puts(p2);
    return 0;
}

局部变量的值这样也能用
怎么会这样。。。
搜索更多相关主题的帖子: 变量 偷梁换柱 局部 
2010-12-22 03:17
zhoufeng1988
Rank: 15Rank: 15Rank: 15Rank: 15Rank: 15
来 自:北京
等 级:贵宾
威 望:27
帖 子:1432
专家分:6329
注 册:2009-5-31
收藏
得分:3 
你是说哪个局部变量?
2010-12-22 09:05
guming001
Rank: 1
等 级:新手上路
帖 子:7
专家分:4
注 册:2010-12-21
收藏
得分:3 
问题的关键是,aa()函数中创建的s不能简单的被理解为是一个char对象的变量,而是一个char*,在函数体里面,你将一个常量"abababababaabababbab"的首地址赋给了s,并在函数结束时返还,所以aa()函数返回的是常量"abababababaabababbab"的首地址(与s无关),所以才会看到结果是你想要的。

但是奉劝一句,严禁在函数体内创建对象变量,并在函数结束时返回,这样会造成不可语句的结果。
2010-12-22 12:42
尝鲜
Rank: 2
等 级:论坛游民
帖 子:24
专家分:12
注 册:2010-10-21
收藏
得分:0 
回复 3楼 guming001
char s[]="abababababaabababbab";
是变量不是常量。。。
不信可以返回
char *p=aa();
puts(p);
结局就杯具了
2010-12-22 15:14
guming001
Rank: 1
等 级:新手上路
帖 子:7
专家分:4
注 册:2010-12-21
收藏
得分:0 
回复 4楼 尝鲜
恩,你说的对,是变量,不是常量,但为什么他把函数体内部的数据块复制出来的时候系统没有回收那块内存就说不清楚了……
2010-12-22 16:39
guming001
Rank: 1
等 级:新手上路
帖 子:7
专家分:4
注 册:2010-12-21
收藏
得分:0 
哦,我明白了,因为puts()是系统提供的接口,调用的时候,系统内部会回收栈内的垃圾内存,所以每次调用puts(),原本那块地址里的内容就会被系统回收,就会变掉了

也就是说,LZ在系统把那块垃圾内存回收前,自己将它拷贝到了另外的位置上,这才使得结果是符合要求的,soga,谢谢啦!尝鲜
2010-12-22 16:46
尝鲜
Rank: 2
等 级:论坛游民
帖 子:24
专家分:12
注 册:2010-10-21
收藏
得分:0 
系统太坏了。。。要到下一个调用函数的时候才清理
这不是让人往陷阱了跳吗。。
系统该勤奋点啊。。。
2010-12-22 17:41
yuccn
Rank: 16Rank: 16Rank: 16Rank: 16
来 自:何方
等 级:版主
威 望:167
帖 子:6815
专家分:42393
注 册:2010-12-16
收藏
得分:3 
问这样的问题可以看出你编程功底不怎么样了。

char *aa()返回的的是一个堆栈(内存)地址,在这个函数返回的时候,那块地址是一块没有被使用的地址了。如果你硬是要访问,只是违规的访问。可能内容是你期望的,大部分可能是一些乱七八糟的数据。

我行我乐
公众号:逻辑客栈
我的博客:
https://blog.yuccn. net
2010-12-23 12:23
df19861017
Rank: 2
等 级:论坛游民
帖 子:15
专家分:29
注 册:2010-9-30
收藏
得分:3 
不要返回指向栈内存的指针或引用!char s[]="abababababaabababbab"改为char *s="abababababaabababbab";

2010-12-23 22:13
快速回复:偷梁换柱_局部变量
数据加载中...
 
   



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

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