C++-为什么下面这段代码会输出乱码?
代码如下:
#include <iostream>
using namespace std;
char* getString()
{
char p[] = "testString";
return p;
}
int main()
{
char *str = getString();
cout << str << endl;
getchar();
return 0;
}
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(8)
char p[] = "testString";属于char* getString()函数的局部变量,变量在栈上,局部变量的生存周期只在该函数生命周期内有效。
如果你要返回有效值的话,建议把变量放到全局区或者堆上,比如加个malloc个指针,或者是
加static关键字,你可以试下。。
getString返回后,你得到的str是个临时内存。
你的内存在堆栈esp的上面。这个时候它在main中确实是正确的,但是当你cout<<str<<endl时,由于操作符触发了函数调用导致了该内存的值被调用operator<<时的堆栈所覆盖。
建议切到汇编调试的方式去看,不用懂汇编,单步执行一次看一次那个内存地址,注意一下字符串被修改前应该会有一个call。
临时变量的问题。赋值完成之后就析构了,看看这个帖子的回答:关于临时变量的释放?
p 是临时变量,如果它要作为返回值,在函数执行完后不会立即释放,而是在执行函数的那条语句执行完之后才释放,所以在 cout 之前,它是没有释放的,到了 cout ,它就释放了。
char p[] = "testString";
是在getString()
函数栈中,但调用 cout 时,getString()
的栈会被覆盖,输出来的结果自然就不是想要的了。可以用 char* p = "testString"; 替代,因为这样 “testString” 会放到常量段中。
这题之前我也做过类似的笔试题,之前也不清楚,现在有点了解:
p[]数组为函数内的局部变量(局部变量,它在程序运行期间不是一直存在的,而只在函数执行期间存在,函数的一次 调用执行结束后,变量被撤销,其所占用的内存也被收回),函数返回后内存已经释放。
乱码原因是:getString()返回的是指向“栈内存”的指针,但其原有的内容已经被清除,新的内同不可知。
哎,数据存放位置没搞清楚造成的哈.
在函数中不是利用new malloc等申请的资源都会存放在栈区,函数结束后栈区的资源是要释放的
char p[]是临时变量啊亲