0

在 C 中,指针包含另一个变量的内存位置。指针变量是存储在栈上还是堆上?

4

3 回答 3

3

指针只是一个变量。把它想象成一个保存内存位置的整数,所以如果你有:

int main(...) {
    char *ptr = malloc( 100 );
    ...
}

thenptr是堆栈上的 4 或 8 字节值,其中包含从堆中分配的 100 字节缓冲区的内存位置。内存本身在堆中,指针栈中。

于 2012-06-27T12:53:54.570 回答
1

它存储在某个地方!

这取决于你,你如何定义指针。

如果它是一个局部变量,它可能在堆栈上,也可能在寄存器中。
如果你通过 malloc() 创建它,它就在堆上。
或者全局,如果它是在模块范围内定义的。

int *pInt_global;

void foo(void)
{
  int *pIntStack;

  int **ppIntHeap;

  ppIntHeap = malloc(sizeof(int *));
}
于 2012-06-27T12:52:00.237 回答
1

这取决于。堆内存是使用 malloc 创建的,堆栈内存是您不使用 malloc 创建的内存(简而言之,但我也应该谈谈静态内存)。

int a;
int* ps;
int* ph;

ps = &a;
ph = malloc(sizeof(int));
a  = 5;

if (ph != NULL) {
    *ph = 5;
}

这里, ps 包含来自堆栈 (a) 的变量的地址,而 ph 包含来自堆的变量的地址。请注意,如果 malloc 没有失败,则两者都引用值 5。另请注意,分配给 ph 的内存应该在某个时候释放,而不是来自 ps 的内存!

如果您在函数中接收到指向某物的指针,则您无法知道它是从堆栈还是从堆引用内存。

于 2012-06-27T12:54:33.710 回答