c-如果malloc重新分配了堆栈变量,会发生什么



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

typedef struct E...
void foo(E* param) {
    param = malloc(sizeof(E));
}
int main() {
    E myParam;
    foo(&myParam);
    free(&myParam); //???
}

如果我们运行main(),就会在main的堆栈框架上声明一些结构myParam。但随后foo()将param重新指向malloc的堆内存块。分配给myParam的堆栈内存会发生什么情况?它是"浪费"的吗?即使我们在myParam中设置字段,它也不会改变吗?我们还能像上面的代码一样释放malloc内存吗?

分配给myParam的堆栈内存会发生什么情况?

什么都没有。

它是"浪费"的吗?即使我们在myParam中设置字段,它也不会改变吗?

不,它没有浪费。如果在myParam中设置字段,则会发生更改。

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

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

free(&myParam);

导致未定义的行为。CCD_ 3未使用CCD_ 4(或其函数族)进行分配。这就是未定义行为的原因。

我试图了解当堆栈/堆变量混合在C中,例如:

没有一致的、可重复的或有用的东西。未定义行为的本质。根据不同

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

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

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

就free()而言,堆栈地址只是一个垃圾值,如果free(。

与将无效指针传递到对"fread()"或"memcpy()"的调用没有什么不同

相关内容

  • 没有找到相关文章

最新更新