首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >函数返回后未销毁Char数组

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

Stack Overflow用户
提问于 2013-02-15 23:19:56
回答 4查看 417关注 0票数 0

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

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

abcdefg a b c d e f g abcdefg?

K Y I

代码语言:javascript
运行
复制
#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; 
}
EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2013-02-15 23:22:44

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

票数 1
EN

Stack Overflow用户

发布于 2013-02-15 23:23:50

你正在做的是未定义的行为,你有一个指针指向一个内存位置,可能是也可能不是。这很糟糕。

实际发生的情况是,您的char buffer tmp位于函数f()的堆栈框架上,当该函数返回时,数据将留在堆栈上,以便被未来的堆栈框架覆盖。

做你已经做过的事情的正确方法是简单的。

代码语言:javascript
运行
复制
std::string f() {
     std::string str ("abcdefg");
     std::cout << str << '\n';
     return str;
}
int main() {
    std::string s=f();
    std::cout << s << '\n';
}
票数 3
EN

Stack Overflow用户

发布于 2013-02-15 23:23:15

您正在调用UB。您可以访问不再为程序分配的内存。幸运的是,它在第一次打印时就能正常工作。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/14897775

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档