What happens to malloc variable in a function?

时间:2016-10-15 17:14:53

标签: c

Assume I create a variable inside a function by using malloc:

int f() 
{
 int* i=(int*)malloc(sizeof(int));
 /* ... */
}

Where is variable i located? In heap or in function f() stack?

4 个答案:

答案 0 :(得分:6)

我将使用p而不是i,因为名为i的变量通常是整数。

void function(void) {
    int *p = malloc(sizeof(*p));
}

此处有两件事:p*p具有以下关系:

  stack          heap
│   ... │     │   ... │
┢━━━━━━━┪     ┢━━━━━━━┪
┃     p ┃ ──→ ┃    *p ┃
┡━━━━━━━┩     ┡━━━━━━━┩
│   ... │     │   ... │

从函数返回后,p消失了。但是,*p将继续分配,直到您致电free()。忘记致电free()表示您有内存泄漏问题,因为即使您无法使用*pp也会永远存在(因为p是消失)。

注意: #include "stdafx.h" #include <iostream> using namespace std; struct IntWrapper { IntWrapper(int _value) : value{ new int(_value) } {} void * value; }; int main() { IntWrapper * foo = new IntWrapper(10); cout << *((int *)(foo->value)); cin.get(); return 0; } 不一定在堆栈上,但你可以假装它是。它可以在寄存器中或完全优化。它甚至可以在堆栈中移动。 &#34; stack&#34;的整个概念和&#34;堆&#34;无论如何都是技术上特定于实施的。

答案 1 :(得分:2)

对于大多数系统,@ Dietrich Epp的答案涵盖了这个问题。为了完整起见,我想补充一下:

没有通用的方法可以说明存储变量的位置和方式。它不是标准的一部分。这取决于您的具体系统。

c中没有堆栈和堆这样的东西。概念是特定于系统的实现细节。

标准(ISO / IEC 9899)指定“存储持续时间”,如下所示:

  

6.2.4对象具有确定其生命周期的存储持续时间。有三个存储空间   持续时间:静态,自动和已分配。

并且标准描述了相关规则,但标准并不关心它是如何实现的。

stackheap的使用在大多数实施中都很常见,但不是任何要求。

答案 2 :(得分:2)

变量是* i。我们没有malloc就在那里。这是一个指针。

malloc返回堆中已分配内存的起始地址。并且=将此地址分配给您的指针。

假设i = NULL您将0指向此指针,或者您也可以为其指定任何内容(例如4711)。但是如果你通过读取或扭曲存储器访问它,地址指向并且它不在你的地址区域中就会出现分段错误。

答案 3 :(得分:1)

i是一个局部变量,因此编译器可以为它分配堆栈存储,但这取决于场景,它也可能在一些简单的用例中,编译器/优化器可以避免堆栈并只使用寄存器

此变量i包含与int大小的空间的动态分配地址对应的数值。