【问题标题】:Does the function level influence the region of memory allocation of a variable from main [duplicate]函数级别是否会影响主变量的内存分配区域[重复]
【发布时间】:2019-03-25 05:58:55
【问题描述】:

我想创建一个为指针(从 main)分配空间以指向的函数。如果在函数中分配了内存,那么在该函数返回后,该内存是否仍然可用并且可以安全使用?下面是代码示例:

int foo(int **number)
{
    *number = (int*)malloc(sizeof(int));
}

int main()
{
    int *myVar;
    foo(&myVar);
}

所以我们看到内存是在foo()函数的执行过程中分配的。

myVar 变量的内存是分配在foo() 函数的“空间”还是main() 的“空间”?

在完成foo() 的执行后,它的内存正在被清除。 myVar 会指向同一个“空间”吗?使用会安全吗?

它会被其他函数或变量声明覆盖吗?

【问题讨论】:

  • 为指针分配空间”,你的代码为int分配空间,而不是for指针。尽管如此,它还是将分配的内存地址(对于int分配给一个指针。在这种情况下,准确的措辞至关重要。

标签: c function pointers memory


【解决方案1】:

不,内存不会在foo 结束时被清除或释放。是的,您在main 中的指针myVar 将正确指向您在foo 中分配的内存。 (您不需要显式转换为int *,顺便说一句)。

动态内存的全部目的是打破由“范围”、“函数”等强加的所有生命周期规则。 malloc 分配的内存独立于任何函数及其“空间”而存在。此内存将持续存在,直到您自己手动取消分配它。只要您的程序运行,动态内存(又名 freestore,又名堆)就会一直存在。

还请注意,您没有分配“指针空间”。您正在分配指针将指向的无名内存块。该块独立于任何指针而存在。你可以有一百个指向同一个块的指针,或者你可以根本没有。

【讨论】:

  • 非常感谢。精炼到位。对我帮助很大。
【解决方案2】:

函数特有的是一个局部变量,它本身可以是一个指针。这些变量存在于堆栈中,并随着函数的作用域(即函数退出时)被清除。

但是当使用malloc/calloc分配内存时,分配的区域在堆中,这与函数的生命周期无关。返回指向该内存区域的指针,该指针是某个函数范围内的变量,或者可能是 main 本身。在你的情况下 - int *myVar

因此,只要您的进程运行获得的指针(使用malloc/calloc),任何地方都是有效的(除非您故意释放它)。

为确保您可以访问内存区域,您需要使用pass by reference 或返回指针本身。

【讨论】:

  • "你需要使用传递引用" C 总是只做"传递值"。它不知道通过引用传递(相对于 C++)。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-10-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多