函数返回后Char数组未被销毁

时间:2013-02-15 15:19:56

标签: c++

在下面的代码中,我希望在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; 
}

4 个答案:

答案 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将继续指向不具有正确值的相同内存位置,因此会观察到不正确的输出。