为啥指针分配的内存在函数之后仍然存在,而不是数组?

Posted

技术标签:

【中文标题】为啥指针分配的内存在函数之后仍然存在,而不是数组?【英文标题】:Why does a pointer's allocated memory persist after a function, but not an array?为什么指针分配的内存在函数之后仍然存在,而不是数组? 【发布时间】:2011-03-28 04:12:41 【问题描述】:

所以,我在 C++ 书籍中看到的基本文本输入函数的上下文中提出了这个问题:

char *getString()

    char temp[80];
    cin >> temp;
    char * pn = new char[strlen(temp + 1)];
    strcpy(pn, temp);
    return pn;

因此 temp 声明了一个包含 80 个字符的数组,这是一个自动变量,其内存将在 getString() 返回时被释放。有人建议,如果您出于某种原因返回temp,则它在函数之外的使用将不可靠,因为一旦函数完成,该内存就会被释放。但是由于我也在同一上下文中声明了pn,为什么它的内存也没有被丢弃?

【问题讨论】:

它是否在没有核心转储的情况下执行?你认为应该是 strlen(temp)+1 而不是 strlen(temp+1)? 【参考方案1】:

因为您使用new 声明的对象是在堆上分配的,而像temp 这样的变量是在堆栈上。

当你的函数返回时,它的栈帧被释放,但堆不受影响。

【讨论】:

感谢您的回复。我还意识到,更具体地说,为 pn 分配的内存(保存此指针地址数据的空间)被丢弃,这就是为什么必须将其内容返回给调用函数以使用它的原因。 pn 指向的内存是动态分配的,会根据你的回答来行动。

以上是关于为啥指针分配的内存在函数之后仍然存在,而不是数组?的主要内容,如果未能解决你的问题,请参考以下文章

C语言中 内存消亡 指向她的指针就一定消亡或成了空指针为啥是错的啊

检查指针是不是已分配内存

在C语言进行编程中,为啥要释放旧内存?

为啥指向 char 数组的指针必须需要 strcpy 才能为其数组分配字符而双引号分配不起作用?

为啥free函数不在释放内存后,将指针置NULL,野指针有啥用

为啥要用Hash