只有栈可以存储局部(指针)变量,堆不行吗?

Joj*_*oji 0 c c++ malloc heap-memory

我是 C 和 C++ 新手。我知道每当调用一个函数时,它的变量都会在堆栈上分配内存,包括变量恰好是一个指针,该指针指向通过mallocor分配在堆上的数据new(但我听说不能保证malloc分配的存储100%在堆上,如果我错了,请纠正我)。例如,

\n
Void fn(){\n    Member *p = new Member()\n}\n \n
Run Code Online (Sandbox Code Playgroud)\n

或者

\n
Void fn() {\n        int *p = (int*) malloc( sizeof(int) * 10 );         \n}\n
Run Code Online (Sandbox Code Playgroud)\n

如果我错了,请纠正,在这两种情况下,变量p(保存堆上分配的对象的地址)都在堆栈上,并且它指向堆上的对象。\n所以说所有的都正确吗?我们声明的变量位于堆栈上,即使它们可能指向堆上的某些内容?\n让\xe2\x80\x99s 说局部变量指针的地址p加载到内存地址001,它具有位于堆上的成员对象的地址,该地址是002。我们可以画这样的图。\n在此输入图像描述

\n

如果这是正确的,我的下一个问题是,我们是否可以拥有一个实际位于堆上的指针,并且它指向位于堆栈上的变量?如果不可能,该指针是否可以指向位于堆上的变量?\n也许这个问题的另一种表达方式是:为了访问堆中的某些内容,我们只能通过堆栈上的指针来访问它?\n可能的图表如下所示

\n

如果可能的话,我可以在这里举个例子吗?

\n

在此输入图像描述

\n

Gal*_*lik 5

是的,您可以将指针放在空闲存储(堆)上并使其指向堆栈上的变量。技巧是创建一个指向指针 (int**) 的指针:

int main()
{
    int i = 0; // int on the stack

    int** ip = new int*; // create an int* (int pointer) on the free store (heap)

    // ip (the int**) is still on the stack

    *ip = &i;
    // Now your free store (heap) located pointer points
    // to your stack based variable i

    delete ip; // clean up
}
Run Code Online (Sandbox Code Playgroud)

注意:术语“堆”和“堆栈”是通用的、易于理解的计算术语。在 C++ 中,它们在标准中被称为“自由存储”,并且(尽管没有直接命名)“堆栈”是 100% 隐含的(例如,通过引用“堆栈展开”),因此是必需的。