在下面的代码中,我希望在f()返回后销毁临时字符数组,因此根本不应该打印x。
然而,在下面的函数中,x在main()中被打印出来,但是for循环没有打印出正确的东西。有没有人能解释这种行为。以下是输出。
abcdefg a b c d e f g abcdefg?
K Y I
#include <iostream>
using namespace std;
char* x;
void f()
{
char tmp[100]= "abcdefg";
x = tmp;
cout << x << endl;
for(int i=0; i < 7; i++)
cout << x[i] << endl;
}
int main()
{
f();
cout << x << endl;
for(int i=0; i < 7; i++)
cout << x[i] << endl;
}发布于 2013-02-15 23:22:44
您正在调用未定义的行为。f()作用域关闭后,指针可能无效,也可能无效。
发布于 2013-02-15 23:23:50
你正在做的是未定义的行为,你有一个指针指向一个内存位置,可能是也可能不是。这很糟糕。
实际发生的情况是,您的char buffer tmp位于函数f()的堆栈框架上,当该函数返回时,数据将留在堆栈上,以便被未来的堆栈框架覆盖。
做你已经做过的事情的正确方法是简单的。
std::string f() {
std::string str ("abcdefg");
std::cout << str << '\n';
return str;
}
int main() {
std::string s=f();
std::cout << s << '\n';
}发布于 2013-02-15 23:23:15
您正在调用UB。您可以访问不再为程序分配的内存。幸运的是,它在第一次打印时就能正常工作。
https://stackoverflow.com/questions/14897775
复制相似问题