0

在下面的代码中,我希望 tmp 字符数组在 f() 返回后被销毁,因此根本不应该打印 x。

但是,在下面的函数中 x 在 main() 中打印,但 for 循环没有打印正确的内容。有人可以解释这种行为。这是输出。

abcdefg a b c d e f g abcdefg ?

k Y 我

#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; 
}
4

4 回答 4

3

您正在做的是未定义的行为,您有一个指向内存位置的指针,该内存位置可能完好,也可能不完好。这是不好的。

实际发生的情况是,您的 char 缓冲区 tmp 位于 function 的堆栈帧上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-15T15:23:50.060 回答
1

您正在调用未定义的行为。f()范围关闭后指针可能有效也可能无效。

于 2013-02-15T15:22:43.577 回答
0

您正在调用 UB。您访问不再为您的程序分配的内存。它在第一次打印时起作用只是运气。

于 2013-02-15T15:23:14.623 回答
0

在您的程序x中,它被定义为一个全局指针,它使用堆栈char temp[100]上分配的地址进行初始化。当函数f返回时,堆栈指针递减。但是,x将继续指向没有正确值的相同内存位置,因此会观察到不正确的输出。

于 2013-02-15T15:28:33.207 回答