地址

2016-02-26 26 views
-1

我學習C和也遇到了這個問題,當我處理函數的棧幀,考慮下面的代碼:地址

#include <stdio.h> 

void function1(void* a){ 
    int b = 5; 

    printf("para add: %p local add: %p\n", &a, &b); 
} 

int main(){ 

    function1(20); 
    function1(30); 
    function1(40); 
    function1(50); 
    function1(60); 
    function1(70); 

    return 0; 
} 

的結果是:

para add: 0020FF08 local add: 0020FEFC 
para add: 0020FF08 local add: 0020FEFC 
para add: 0020FF08 local add: 0020FEFC 
para add: 0020FF08 local add: 0020FEFC 
para add: 0020FF08 local add: 0020FEFC 
para add: 0020FF08 local add: 0020FEFC 

我知道每個函數都有它的地址,但每個局部變量的地址和函數中的每個參數總是一樣的嗎?

+0

'printf()'中的'%p'調用'void *',而不是另一個指針。將具有錯誤類型的數據傳遞給'printf()'調用未定義的行爲*。 – MikeCAT

+0

C標準沒有強制使用堆棧或任何其他內存管理技術。有很好的實現,根本不使用堆棧。 – Olaf

回答

1

不,它們並不總是相同的。如果堆棧用於運行程序的環境中的參數和局部變量,則它可能取決於堆棧指針。

例如,此代碼在ideone.com中獲得了不同的地址。

#include <stdio.h> 

void function1(void* a){ 
    int b = 5; 

    printf("para add: %p local add: %p\n", (void*)&a, (void*)&b); 
} 

void test(void) { 
    int testData[100]; 
    function1(&testData[99]); 
} 

int main(void){ 

    function1((void*)20); /* converted in implementation-defined manner */ 
    test(); 

    return 0; 
} 

輸出:

para add: 0xbfcce408 local add: 0xbfcce40c 
para add: 0xbfcce248 local add: 0xbfcce24c 
0

的參數和在堆棧上的局部變量的確切位置是實現定義。這就是說,一般來說,你會發現局部變量比參數更靠近棧頂,而在大多數實現中,棧會向下增長。