函数返回后字符数组未被破坏
问题描述:
在下面的代码中,我希望tmp字符数组在f()返回后被销毁,因此x根本不应该被打印。函数返回后字符数组未被破坏
但是,在下面的函数x获得打印在main()但for循环不打印正确的东西。有人可以解释这种行为。这是输出。
ABCDEFG 一个 b Ç d Ë ˚F 克 ABCDEFG ?
ķ Ÿ 我
#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;
}
答
您正在调用UB。您访问不再为您的程序分配的内存。这仅仅是运气它在第一印刷品上运作。
答
你在做什么是未定义的行为,你有一个指向一个内存位置的指针可能会或可能不会。这不好。
实际发生的是你的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';
}
答
在程序x
被定义为一个全球性的指针作为char temp[100]
是在栈上分配的,其与栈上的地址进行初始化。当函数f
返回时,堆栈指针递减。但是,x
将继续指向相同的内存位置,该内存位置将不具有正确的值,因此会观察到错误的输出。
定义“破坏”。 tmp在堆栈上创建。如果您在调用f()之后调用另一个方法,可能会覆盖tmp,否则编译器没有理由重写堆栈来整理事情。但是,你正在做的事情被认为是危险的。 – Pete 2013-02-15 15:22:40
请选择C或C++。 – 2013-02-15 15:23:02
什么是“我是”? – banuj 2013-02-15 15:23:56