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

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

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

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



在vs2010中,能正常打印出来..

------解决方案--------------------
巧合。
------解决方案--------------------
可能内核没来得及清理,就被打出来了
------解决方案--------------------
因为是常量字符串,其地址是固定的
------解决方案--------------------
探讨

因为是常量字符串,其地址是固定的

------解决方案--------------------
探讨
因为是常量字符串,其地址是固定的

------解决方案--------------------
运气好而已。。

------解决方案--------------------
分析下这段代码,绝对跟常量指针不搭架,首先先是声明了个数组,然后对数组进行赋值。
紧接着将这个数组的头指针传出来,因为是临时变量,所以很有可能在得到这个指针后,系统把栈给释放掉。
然后你就会得到莫名其妙的东西。。。
------解决方案--------------------
我取消我的发言....现在我也不是很清楚...尴尬
------解决方案--------------------
探讨
分析下这段代码,绝对跟常量指针不搭架,首先先是声明了个数组,然后对数组进行赋值。
紧接着将这个数组的头指针传出来,因为是临时变量,所以很有可能在得到这个指针后,系统把栈给释放掉。
然后你就会得到莫名其妙的东西。。。

------解决方案--------------------
str=returnStr(); 
printf("%s\n", str); 

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


局部变量的申请和回收 也只是一个指针上移下移操作而已,只要原来的局部变量没有被破坏,那么他当然会保持原来的样子, 因为什么时候会被破坏我们不知道,是有编译器决定的,所以我们通常说他的内容已经失效,使用的话有可能导致未知的错误
------解决方案--------------------
这位说得对啊!
连着用就没有问题

探讨
str=returnStr();
printf("%s\n", str);

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


局部变量的申请和回收 也只是一个指针上移下移操作而已,只要原来的局部变量没有被破坏,那么他当然会保持原来的样子, 因为什么时候会被破坏我们不知道,是有编译器决定的,所以我们通常说他的内容已经失效,使用的话有可能导致未知的错误

------解决方案--------------------
不同的编译器,不同的编译选项,对堆栈中的内容有不同影响,所以说是巧合。

楼主可以试试不同的编译器和不同的编译选项。
------解决方案--------------------
运气好而已
不要纠结于这种问题
------解决方案--------------------
学习!
------解决方案--------------------
编译器有时候出的问题,真叫人纠结
------解决方案--------------------
菜鸟时写过这种bug代码
------解决方案--------------------
这种代码很考验人品啊!