2013-10-07 31 views
1

比方说,我有这些变量和指针。我如何确定堆栈或堆中的哪一个?在C中确定变量堆栈或堆?

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

    } 
+1

因为没有动态分配的问题是,这些都是变量的函数体中声明,或者在文件/全球范围有多大? – jxh

+0

代码已更改为更好的意义 – answerSeeker

+0

好奇,您的用例是什么? –

回答

1

所有变量都有自动范围。它们来自“堆栈”,因为函数返回后变量不再有效。

命名的函数变量永远不可能来自“堆”,因为你的意思是它。用于命名函数变量的内存始终与函数作用域(或声明该变量的函数内部的最内部块作用域)绑定。

变量可以被分配一个由malloc()或类似的动态分配函数获得的值。然后该变量指向存在于“堆”中的对象。但是,在“堆”中,指定的指针变量本身是而不是

有时“堆栈”本身是动态分配的。如为一个线程。然后,用于分配在该线程内运行的函数局部变量的内存位于“堆”中。但是,变量本身仍然是自动的,因为一旦函数返回,变量就是无效的。

+0

如果我有'num = * zLkr [2];'在函数中的值将是3,但仍然会在堆栈? – answerSeeker

+0

'num'在堆栈中。 '* zLkr [2]'是一个无效的表达式。 'zLkr'指向'&a [0]'。 'a'在“堆栈”上。 – jxh

+0

所以它应该是'num =&zLkr [2];'那么这个值仍然是0?它仍然会在堆栈中? – answerSeeker

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; 
} 
+0

没有malloc,变量是否总是在堆栈上?除非他们是全球性的? – answerSeeker

+0

是的。全局变量通常以内存中的数据段结束,而不是堆或堆栈的一部分 – EvilTeach