注册 登录
编程论坛 C++教室

偷梁换柱_局部变量

尝鲜 发布于 2010-12-22 03:17, 677 次点击
程序代码:
#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;
}

局部变量的值这样也能用
怎么会这样。。。
8 回复
#2
zhoufeng19882010-12-22 09:05
你是说哪个局部变量?
#3
guming0012010-12-22 12:42
问题的关键是,aa()函数中创建的s不能简单的被理解为是一个char对象的变量,而是一个char*,在函数体里面,你将一个常量"abababababaabababbab"的首地址赋给了s,并在函数结束时返还,所以aa()函数返回的是常量"abababababaabababbab"的首地址(与s无关),所以才会看到结果是你想要的。

但是奉劝一句,严禁在函数体内创建对象变量,并在函数结束时返回,这样会造成不可语句的结果。
#4
尝鲜2010-12-22 15:14
回复 3楼 guming001
char s[]="abababababaabababbab";
是变量不是常量。。。
不信可以返回
char *p=aa();
puts(p);
结局就杯具了
#5
guming0012010-12-22 16:39
回复 4楼 尝鲜
恩,你说的对,是变量,不是常量,但为什么他把函数体内部的数据块复制出来的时候系统没有回收那块内存就说不清楚了……
#6
guming0012010-12-22 16:46
哦,我明白了,因为puts()是系统提供的接口,调用的时候,系统内部会回收栈内的垃圾内存,所以每次调用puts(),原本那块地址里的内容就会被系统回收,就会变掉了

也就是说,LZ在系统把那块垃圾内存回收前,自己将它拷贝到了另外的位置上,这才使得结果是符合要求的,soga,谢谢啦!尝鲜
#7
尝鲜2010-12-22 17:41
系统太坏了。。。要到下一个调用函数的时候才清理
这不是让人往陷阱了跳吗。。
系统该勤奋点啊。。。
#8
yuccn2010-12-23 12:23
问这样的问题可以看出你编程功底不怎么样了。

char *aa()返回的的是一个堆栈(内存)地址,在这个函数返回的时候,那块地址是一块没有被使用的地址了。如果你硬是要访问,只是违规的访问。可能内容是你期望的,大部分可能是一些乱七八糟的数据。
#9
df198610172010-12-23 22:13
不要返回指向栈内存的指针或引用!char s[]="abababababaabababbab"改为char *s="abababababaabababbab";

1