在下面的代码中,我希望在f()返回后销毁tmp字符数组,因此根本不应该打印x。
但是,在下面的函数x中,在main()中打印,但for循环不能打印正确的东西。有人可以解释这种行为。这是输出。
ABCDEFG 一个 b C d Ë F G 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;
}
答案 0 :(得分:3)
您正在做的是未定义的行为,您有一个指向内存位置的指针,可能有也可能没有。这很糟糕。
实际发生的是,char缓冲区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';
}
答案 1 :(得分:1)
您正在调用未定义的行为。 f()
范围关闭后,指针可能有效,也可能无效。
答案 2 :(得分:0)
您正在调用UB。您可以访问不再为您的程序分配的内存。它只是运气,它适用于第一次印刷。
答案 3 :(得分:0)
在你的程序中x
被定义为一个全局指针,它在堆栈上分配了char temp[100]
时堆栈上的地址初始化。当函数f
返回时,堆栈指针递减。但是,x
将继续指向不具有正确值的相同内存位置,因此会观察到不正确的输出。