2012-06-27 58 views
0

在C中,指針包含另一個變量的內存位置。指針變量是存儲在堆棧上還是存儲在堆上?指針存儲在C中

+7

可能是。 –

+0

取決於你如何存儲指針^ – Bort

+1

Angus,從內存的角度來看,一個指針是一個類似於彼此的變量,那麼它既可以存儲在堆中(如果分配或全局),也可以存儲在堆棧中(如果是本地)。 –

回答

3

指針只是一個變量。你可以把它作爲保留存儲位置的整數,所以如果你有:

int main(...) { 
    char *ptr = malloc(100); 
    ... 
} 

然後ptr是堆棧上的四個或八個字節的值,它包含分配的100字節的緩衝區的內存位置從堆。 內存本身在堆中,指針在堆棧上。

+0

感謝您幫助我理解。你已經解釋清楚了。 – Angus

1

它存儲在某個地方!

這取決於你,你如何定義指針。

如果它是一個局部變量,它可能在堆棧或寄存器中。
如果你通過malloc()創建它,它就在堆上。
或全局,如果它在模塊範圍內定義。

int *pInt_global; 

void foo(void) 
{ 
    int *pIntStack; 

    int **ppIntHeap; 

    ppIntHeap = malloc(sizeof(int *)); 
} 
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中的內存!

如果您在函數中接收到某個指針,則無法知道它是從堆棧還是從堆中引用內存。

+0

謝謝你幫助我理解。 – Angus