在C中确定变量堆栈或堆?

时间:2013-10-07 03:42:13

标签: c stack heap

假设我有这些变量和指针。如何确定堆栈或堆中的哪个?

     #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;

    }

2 个答案:

答案 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;
}