2013-10-07 33 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