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

C 返回本地分配的内存而不是本地变量是否有效,c,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; } 编译器没有给出任何类型的错误,

考虑以下代码:

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

编译器没有给出任何类型的错误,根据我所读的内容,如果它是有效的或不是推荐的方法,我还没有遇到过这样的示例。返回本地分配内存的地址可以吗?

这取决于您的使用情况,只要您跟踪对地址的调用,并在不再需要时释放该地址的内存,就可以了


看看这个不是我的-在动态对象标题下,你对函数返回的东西有着很好的偏执,请继续。 您担心返回指向malloced内存的指针与返回指向本地非静态变量的指针一样糟糕。我假设您在删除最后一个指向内存的指针之前,已经意识到需要释放内存。它确实在程序终止时被释放,但您不想依赖它,因为它代表了一个思维陷阱。如果你没有一个清晰的想法/计划,什么时候释放你曾经处理过的任何东西,那么你正朝着难以调试的内存泄漏的方向前进。只有当你在快速和/或大循环中泄漏时,它们才会受伤

当函数离开时,局部变量停止存在,即链接器不再意识到它,内存将很快用于不同的事情,而malloced内存则不同。 函数malloc是动态内存的API。假设还有空间,它会在堆中为您找到一个空间。它会为你保留这段记忆,直到你不再需要它,并用free这样说。 为此,malloc/free可以访问其他管理数据。这允许free知道内存的大小,即使free没有获得size参数malloc-got。同样的数据也让malloc知道有多少可用空间和在哪里;相当复杂

堆和堆栈的区别在于访问的类型。堆栈从顶部开始使用。用于局部变量的几个字节。堆栈的优雅之处在于它的效率,它只知道堆栈顶部在哪里;与malloc/free相比,它的复杂性要小得多。 缺点是你必须停止使用空间,然后才能再次使用你作品下面的任何东西。这就是杀死局部变量的原因


所以,只要你在某个时候说“自由”,你就安全了。

需要考虑的是:malloc本身做什么?但你应该释放分配的内存。@Olaf,分配一个内存块在我开始理解时,但是,如果它类似于自动变量,我会感到困惑。这不是我的观点。仔细阅读我的评论和有关它的事情!然后阅读malloc的文档和关于动态内存分配的标准。你需要C语言的基础知识,你可以在任何一本C语言书中找到;在提出这些问题之前,请自己做一些研究。那么:你发现了什么?具体是什么还不清楚?为什么?真是中大奖了!!,谢谢“需要在程序终止前释放内存”-需要什么?你能说出一个需要这样做的环境吗?@Thingywot坐在公平点上。我得想想我的真正意思。当我找到一种表达方式时,我把它写进了答案中。谢谢