【问题标题】:scope of struct pointers in functions函数中结构指针的范围
【发布时间】:2013-03-10 09:27:27
【问题描述】:

如果我在函数中有以下内容:

struct example *A=malloc(sizeof(struct example));

在函数结束/离开后 A 指向的节点/内存空间是否被销毁?还是留在堆中?

【问题讨论】:

  • 当函数终止时,堆栈上的 *A(pointer) 被破坏,但是分配给 *A 的内存仍然存在。由于该内存不再具有有效的指针,因此它超出了系统内存结构,即称为内存泄漏。所以你必须始终使用 free() 和 malloc();

标签: c pointers struct heap-memory function-pointers


【解决方案1】:

没有。 malloc 分配的内存将一直分配到free'd。

这样做:

char * function(void)
{
    char c = 'a';
    return &c;
}

另一方面,这很糟糕,因为这个对象在函数结束时确实超出了范围。

malloc 在堆上分配内存。声明变量会在堆栈上分配空间。栈受作用域影响,堆则不受。

有关指针使用的更多信息,包括各种陷阱,例如内存泄漏(丢失对malloc'd 内存的引用以使其永久存在的过程),请访问this link

【讨论】:

    【解决方案2】:

    你必须freemalloc 的一切。当您的函数返回时,变量 A 超出范围,但您的内存保持分配状态。由于您丢失了指向内存的指针(除非存储在其他地方),您是leaking memory

    如果您仍然需要A 指向的内存,您可以返回指向已分配结构的指针,然后释放它。如果函数返回后不需要分配的内存,请使用 free(A) 释放内存。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-09-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-11-25
      • 1970-01-01
      • 1970-01-01
      • 2019-05-16
      相关资源
      最近更新 更多