返回信息流char* test(void)
{
char str[]="hello world!";
return str;
}
void main(void)
{
char *p;
p=test();
cout<<p<<endl;
}
运行结果为乱码,求助各位大神:虽然函数局部变量保存在栈当中,难道return不是将str的值拷贝一份传回给一个临时变量么,他返回的是什么?
问题来自test2
这是一条镜像帖。来源:北邮人论坛 / cpp / #87491同步于 2015/6/11
该镜像源已超过 30 天没有更新,可能在源站已被删除。
CPP机器人发帖
[问题] return 的疑惑
wujian4
2015/6/11镜像同步11 回复
订阅后,新回复会通过你的通知中心匿名送达。
9 条回复
临时变量什么的,一般情况下都会在函数调用完后自动销毁了,也就理所应当乱码了。
况且你的test函数返回的是指针,不是值,拷贝也顶多是将str的指针拷贝了一份。
也就是说return 返回的是str的指针,但是因为函数调用结束之后,str自动销毁,但是此时str的指针并没有销毁,所以会导致乱码,如果这个指针销毁会报错?......这个理解有错吗?thx...
也许有些编译器在函数返回时不会销毁局部变量。
但是这里,当你调用cout时,栈中的hello world已经被乱七八糟的东西覆盖。
不过无论编译器是否销毁局部变量,也还是不要写这样的程序了
求指导,怎么写..或者指教一本书,还是别的什么?
【 在 inaadversity 的大作中提到: 】
: 也许有些编译器在函数返回时不会销毁局部变量。
: 但是这里,当你调用cout时,栈中的hello world已经被乱七八糟的东西覆盖。
: 不过无论编译器是否销毁局部变量,也还是不要写这样的程序了
你可以这么写:
char* test(void)
{
char *str="hello world!";
return str;
}
这么写能成功的依据是:hello world字符串是一个常量,存在于常量区而非栈区,不用担心销毁问题 str的值就是helloworld所在常量区的地址。
当然你也可以这么写:
char* test(void)
{
char *str=(char *)malloc(sizeof("hello world!"));
strcpy(str,"hello world");
return str;
}
不过这样有可能会导致内存泄露的问题,不推荐使用
【 在 wujian4 的大作中提到: 】
: 求指导,怎么写..或者指教一本书,还是别的什么?
额....能解释下为什么这样写串就是常量了么,我比较困惑这点?
第二种我知道,因为是自己开辟的,数据被放在堆数据区,我们不销毁的话,是不会自动销毁的。strcpy_s可以缓解内存泄露问题。不知道说的对不对,刚看的,现学现卖 说不对轻拍...
【 在 inaadversity 的大作中提到: 】
: 你可以这么写:
: [code=c]
: char* test(void)
: ...................
首先你应该知道程序有一个区段是叫做常量区,顾名思义就是存储程序中的常量的
char *str = "hello world",所做的操作是把常量区中的地址,赋值给str这个变量
char str[] = "hello world" 所做的操作是把hello world拷贝到str数组中
你可以打印一下这两种情况下 str的值就知道了。
内存泄露指的是,在函数中动态分配的内存,但是在函数退出时没有释放,有可能会导致这段内存永远也不会释放
你说的strcpy_s防止的是内存越界问题。
【 在 wujian4 的大作中提到: 】
: 额....能解释下为什么这样写串就是常量了么,我比较困惑这点?
: 第二种我知道,因为是自己开辟的,数据被放在堆数据区,我们不销毁的话,是不会自动销毁的。strcpy_s可以缓解内存泄露问题。不知道说的对不对,刚看的,现学现卖 说不对轻拍...
哦....受教了,谢谢...
【 在 inaadversity 的大作中提到: 】
: 首先你应该知道程序有一个区段是叫做常量区,顾名思义就是存储程序中的常量的
: char *str = "hello world",所做的操作是把常量区中的地址,赋值给str这个变量
: char str[] = "hello world" 所做的操作是把hello world拷贝到str数组中
: ...................