假设我有这些变量和指针。如何确定堆栈或堆中的哪个?
#include <stdio.h>
#define SIZE 5
int main( void ) {
int *zLkr;
int *aLkr= NULL;
void *sLkr= NULL;
int num, k;
int a[SIZE] = { 1, 2, 3, 4, 5 };
zLkr = a;
}
答案 0 :(得分:1)
所有变量都有自动范围。它们来自“堆栈”,因为一旦函数返回,变量就不再有效。
在你意指的意义上,命名函数变量永远不会来自“堆”。命名函数变量的内存始终与函数作用域(或声明变量的函数中最内部的块作用域)相关联。
可以为变量分配由malloc()
或类似的动态分配函数获得的值。然后该变量指向存在于“堆”中的对象。但是,命名指针变量本身在“堆”中不是。
有时“堆栈”本身是动态分配的。比如一个帖子。然后,用于分配在该线程内运行的函数局部变量的内存位于“堆”中。但是,变量本身仍然是自动的,因为一旦函数返回它们就无效了。
答案 1 :(得分:1)
局部变量在堆栈
上分配int main(void)
{
int thisVariableIsOnTheStack;
return 0;
}
来自堆的变量通过malloc在内存中的某处分配。该内存可以返回到堆中,并由以后的malloc调用重用。
int main(void)
{
char *thisVariableIsOnTheHeap = (char *) malloc(100);
free (thisVariableIsOnTheHeap);
return 0;
}
模块变量都不是。它们在一个模块的内存中有一个恒定的地址。
void f1(void)
{
/* This function doesn't see thisIsAModule */
}
int thisIsaModule = 3;
void f(void)
{
thisIsaModule *= 2;
}
int main(void)
{
return thisIsaModule;
}
全局变量都不是。它们在内存中具有恒定值,但可以跨模块引用。
extern int globalVariable; /* This is set in some other module. */
int main(void)
{
return globalVariable;
}