这段代码返回局部变量的指针为什么能行?

tx183584 2011-07-04 04:14:23

char *returnStr()
{
char p[]="hello world!";
return p;
}

int _tmain()
{
char *str;
str=returnStr();
printf("%s\n", str);
return 0;
}


在vs2010中,能正常打印出来..
...全文
132 17 打赏 收藏 转发到动态 举报
写回复
用AI写文章
17 条回复
切换为时间正序
请发表友善的回复…
发表回复
smwhotjay 2011-07-05
  • 打赏
  • 举报
回复
菜鸟时写过这种bug代码
lflljt 2011-07-05
  • 打赏
  • 举报
回复
编译器有时候出的问题,真叫人纠结
今晚又失眠 2011-07-05
  • 打赏
  • 举报
回复
学习!
向立天 2011-07-05
  • 打赏
  • 举报
回复
运气好而已
不要纠结于这种问题
dengzikun 2011-07-05
  • 打赏
  • 举报
回复
不同的编译器,不同的编译选项,对堆栈中的内容有不同影响,所以说是巧合。

楼主可以试试不同的编译器和不同的编译选项。
shiyunqiang 2011-07-05
  • 打赏
  • 举报
回复
这种代码很考验人品啊!
橘子 2011-07-04
  • 打赏
  • 举报
回复
这位说得对啊!
连着用就没有问题

[Quote=引用 10 楼 saberiii 的回复:]
str=returnStr();
printf("%s\n", str);

如果这2句 永远连着用 那肯定正常,不是巧合


局部变量的申请和回收 也只是一个指针上移下移操作而已,只要原来的局部变量没有被破坏,那么他当然会保持原来的样子, 因为什么时候会被破坏我们不知道,是有编译器决定的,所以我们通常说他的内容已经失效,使用的话有可能导致未知的错误
[/Quote]
SaberIII 2011-07-04
  • 打赏
  • 举报
回复
str=returnStr();
printf("%s\n", str);

如果这2句 永远连着用 那肯定正常,不是巧合


局部变量的申请和回收 也只是一个指针上移下移操作而已,只要原来的局部变量没有被破坏,那么他当然会保持原来的样子, 因为什么时候会被破坏我们不知道,是有编译器决定的,所以我们通常说他的内容已经失效,使用的话有可能导致未知的错误
橘子 2011-07-04
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 badbirdboy 的回复:]
分析下这段代码,绝对跟常量指针不搭架,首先先是声明了个数组,然后对数组进行赋值。
紧接着将这个数组的头指针传出来,因为是临时变量,所以很有可能在得到这个指针后,系统把栈给释放掉。
然后你就会得到莫名其妙的东西。。。
[/Quote]

我试验了下,

#include <iostream>

using namespace std;

char *returnStr()
{
char p[]="aaa";
return p;
}

int main()
{
char *str;
str=returnStr();

//输出1
cout<<*(str)<<*(str+1)<<*(str+2)<<endl;

//输出2
for(int n=0; n<3; n++)
{
cout<<*(str+n);
}
cout<<endl;

return 0;
}


大家猜下结果会是怎么样的!!
橘子 2011-07-04
  • 打赏
  • 举报
回复
我取消我的发言....现在我也不是很清楚...尴尬
badbirdboy 2011-07-04
  • 打赏
  • 举报
回复
分析下这段代码,绝对跟常量指针不搭架,首先先是声明了个数组,然后对数组进行赋值。
紧接着将这个数组的头指针传出来,因为是临时变量,所以很有可能在得到这个指针后,系统把栈给释放掉。
然后你就会得到莫名其妙的东西。。。
青稞 2011-07-04
  • 打赏
  • 举报
回复
运气好而已。。
橘子 2011-07-04
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 tzxx 的回复:]
因为是常量字符串,其地址是固定的
[/Quote]

这个不叫 局部变量指针,这个叫常量指针
__lhy 2011-07-04
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 tzxx 的回复:]

因为是常量字符串,其地址是固定的
[/Quote]
p[]不是指针
tzxx 2011-07-04
  • 打赏
  • 举报
回复
因为是常量字符串,其地址是固定的
badbirdboy 2011-07-04
  • 打赏
  • 举报
回复
可能内核没来得及清理,就被打出来了
dengzikun 2011-07-04
  • 打赏
  • 举报
回复
巧合。

2,586

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 资源
社区管理员
  • 资源
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧