返回本地分配的内存是否有效 - 而不是局部变量

时间:2017-04-08 16:15:05

标签: c

请考虑以下代码:

#include <stdio.h>
#include <stdlib.h>

char* address(void);

int main(void)
{
    printf("The address is: %p", address());
    return 0;
}

char* address(void)
{
    char* temp = malloc(20);

    return temp;
}  

编译器没有给出任何类型的错误,直到我读过的内容,如果它是有效的或不是推荐的方法,我都没有遇到过这样的例子。(鉴于释放的内存在某些时候完成)。可以返回本地分配的内存地址吗?

2 个答案:

答案 0 :(得分:1)

真的取决于您的使用情况,只要您跟踪拨打电话的地址(),并且当您不再需要时,您可以释放该地址的内存,它应该没事。

查看此link(不是我的 - 在&#34;动态对象&#34;标题下)

答案 1 :(得分:0)

你很擅长从功能中归还东西,保持这种状态 您担心返回指向malloced内存的指针与返回指向本地非静态变量的指针一样糟糕。我将假设您在删除最后一个指针之前需要释放该内存。它确实在程序终止时被释放,但你不想依赖它,因为它代表了一个思维陷阱。如果你没有一个明确的想法/计划,何时释放任何你曾经编过的东西,那么你正在努力调试内存泄漏。如果你在快速和/或大循环中泄漏,它们只会受到伤害。

当函数剩下时局部变量停止存在(即链接器不再知道它并且内存将很快用于不同的东西),malloced内存的情况则不同。
函数“malloc()”是动态内存的API。它在堆中找到了一个空间(假设仍有空间)。它将为你保留那段记忆,直到你不再想要它并使用“free()”这样说 为此,“malloc()/ free()”访问其他管理数据。这允许“free()”知道你的内存大小,即使free没有获得大小参数“malloc()”。相同的数据还允许“malloc()”知道可用空间和位置;很复杂。

堆和堆栈之间的区别是访问的类型。堆栈从顶部使用。用于局部变量的几个字节。堆栈的优雅是它的效率,它只知道堆栈顶部的位置;比“malloc()/ free()”具有的要复杂得多 缺点是你必须停止使用空间才能再次使用你的作品下面的任何东西。这就是杀死局部变量的原因。

所以,只要你在某个时候说“free()”,你就是安全的。