函数返回后未销毁字符数组

Char array not destroyed after function returns

本文关键字:字符 数组 返回 函数      更新时间:2023-10-16

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

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

abcdefg一bcdefgabcdefg?

kYi

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

您所做的是未定义的行为,您有一个指向内存位置的指针,该位置可能不正确,也可能不正确。这太糟糕了。

实际发生的情况是,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';
}

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

您正在调用UB。您访问的内存不再分配给您的程序。幸运的是,它第一次印刷就成功了。

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