C++-为什么下面这段代码会输出乱码?

发布于 2016-11-18 12:37:22 字数 333 浏览 1341 评论 8

代码如下:

#include <iostream>
using namespace std;

char* getString()
{
char p[] = "testString";
return p;
}

int main()
{
char *str = getString();
cout << str << endl;
getchar();
return 0;
}

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(8

泛泛之交 2017-10-05 19:21:45

char p[] = "testString";属于char* getString()函数的局部变量,变量在栈上,局部变量的生存周期只在该函数生命周期内有效。
如果你要返回有效值的话,建议把变量放到全局区或者堆上,比如加个malloc个指针,或者是
加static关键字,你可以试下。。

偏爱自由 2017-09-19 12:49:16

getString返回后,你得到的str是个临时内存。
你的内存在堆栈esp的上面。这个时候它在main中确实是正确的,但是当你cout<<str<<endl时,由于操作符触发了函数调用导致了该内存的值被调用operator<<时的堆栈所覆盖。

建议切到汇编调试的方式去看,不用懂汇编,单步执行一次看一次那个内存地址,注意一下字符串被修改前应该会有一个call。

偏爱自由 2017-08-22 05:33:17

临时变量的问题。赋值完成之后就析构了,看看这个帖子的回答:关于临时变量的释放?

归属感 2017-06-12 05:57:45

p 是临时变量,如果它要作为返回值,在函数执行完后不会立即释放,而是在执行函数的那条语句执行完之后才释放,所以在 cout 之前,它是没有释放的,到了 cout ,它就释放了。

清晨说ぺ晚安 2017-03-31 14:41:24

char p[] = "testString"; 是在 getString() 函数栈中,但调用 cout 时,getString() 的栈会被覆盖,输出来的结果自然就不是想要的了。

可以用 char* p = "testString"; 替代,因为这样 “testString” 会放到常量段中。

甜柠檬 2017-03-24 15:42:00

这题之前我也做过类似的笔试题,之前也不清楚,现在有点了解:
p[]数组为函数内的局部变量(局部变量,它在程序运行期间不是一直存在的,而只在函数执行期间存在,函数的一次 调用执行结束后,变量被撤销,其所占用的内存也被收回),函数返回后内存已经释放。
乱码原因是:getString()返回的是指向“栈内存”的指针,但其原有的内容已经被清除,新的内同不可知。

夜无邪 2017-02-26 10:29:40

哎,数据存放位置没搞清楚造成的哈.
在函数中不是利用new malloc等申请的资源都会存放在栈区,函数结束后栈区的资源是要释放的

虐人心 2016-12-10 11:22:28

char p[]是临时变量啊亲

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文