在 C 中,指针包含另一个变量的内存位置。指针变量是存储在栈上还是堆上?
问问题
1172 次
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 回答