【问题标题】:What happens to stack variables if they are reassigned by malloc?如果堆栈变量被 malloc 重新分配,它们会发生什么?
【发布时间】:2014-12-21 14:05:14
【问题描述】:

我试图了解当堆栈/堆变量在 C 中混合时会发生什么,例如:

typedef struct E...

void foo(E* param) {
    param = malloc(sizeof(E));
}

int main() {
    E myParam;
    foo(&myParam);
    free(&myParam); //???
}

如果我们运行 main(),一些 struct myParam 会在 main 的栈帧上声明。但随后 foo() 将参数重新指向一个 malloc 的堆内存块。分配给 myParam 的堆栈内存会发生什么变化?即使我们在 myParam 中设置字段,它是否“浪费”并且不会改变?我们还能像上面的代码那样释放 malloc 的内存吗?

【问题讨论】:

  • foo()param 设置不影响myParamparam原来是myParam地址的副本。 free(&myParam) 不好。

标签: c memory malloc heap-memory stack-memory


【解决方案1】:

分配给 myParam 的堆栈内存会发生什么变化?

什么都没有。

它是否“浪费”并且即使我们在 myParam 中设置字段也不会改变?

不,没有浪费。如果您在myParam 中设置字段,它将改变。

我们还能像上面的代码那样释放 malloc 的内存吗?

不,你不能。在foo 中分配的内存被分配给一个局部变量。这是内存泄漏。调用

free(&myParam);

导致未定义的行为。 &myParam 未使用 malloc(或其函数族)分配。这是导致未定义行为的原因。

【讨论】:

    【解决方案2】:

    我试图了解当堆栈/堆变量出现时会发生什么 混入C中,例如:

    没有一致的、可重复的或有用的。未定义行为的本质。会因人而异

    1. 每个编译器
    2. stdlib(malloc 堆管理器)的每个实现
    3. 每个程序和迭代

    malloc/free 的一个实现可能是一个智能堆,它在执行任何操作之前检查您传递给 free() 的地址的有效性,以验证它们是否位于有效的“竞技场”或堆区域中。下一个 malloc 实现可能会假设您传递给 free 的指针是正确的,并在相对于您传递的指针的地址中访问或设置隐藏的堆簿记值。由于指针不正确,您实际上是在编写整个程序堆栈,并可能同时占用堆组织。

    没有标准的 malloc/free 实现,所以有很多可能性。

    就 free() 而言,堆栈地址只是一个垃圾值,如果 free() 假定该地址位于已被伙伴系统划分的堆区域内,它会将您的堆栈视为它的从实验的角度来看,堆区域不是什么好东西,也不是任何有意义的东西。

    与将无效指针传递给“fread()”或“memcpy()”调用没有什么不同

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-08-30
      • 2013-06-22
      • 2012-06-23
      • 2021-11-29
      • 1970-01-01
      • 1970-01-01
      • 2011-07-16
      • 1970-01-01
      相关资源
      最近更新 更多