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?
答案 0 :(得分:6)
我将使用p
而不是i
,因为名为i
的变量通常是整数。
void function(void) {
int *p = malloc(sizeof(*p));
}
此处有两件事:p
和*p
具有以下关系:
stack heap │ ... │ │ ... │ ┢━━━━━━━┪ ┢━━━━━━━┪ ┃ p ┃ ──→ ┃ *p ┃ ┡━━━━━━━┩ ┡━━━━━━━┩ │ ... │ │ ... │
从函数返回后,p
消失了。但是,*p
将继续分配,直到您致电free()
。忘记致电free()
表示您有内存泄漏问题,因为即使您无法使用*p
,p
也会永远存在(因为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对象具有确定其生命周期的存储持续时间。有三个存储空间 持续时间:静态,自动和已分配。
并且标准描述了相关规则,但标准并不关心它是如何实现的。
stack
和heap
的使用在大多数实施中都很常见,但不是任何要求。
答案 2 :(得分:2)
变量是* i。我们没有malloc就在那里。这是一个指针。
malloc返回堆中已分配内存的起始地址。并且=将此地址分配给您的指针。
假设i = NULL您将0指向此指针,或者您也可以为其指定任何内容(例如4711)。但是如果你通过读取或扭曲存储器访问它,地址指向并且它不在你的地址区域中就会出现分段错误。
答案 3 :(得分:1)
i
是一个局部变量,因此编译器可以为它分配堆栈存储,但这取决于场景,它也可能在一些简单的用例中,编译器/优化器可以避免堆栈并只使用寄存器
此变量i
包含与int大小的空间的动态分配地址对应的数值。