2011-12-22 178 views
2

請參閱下面的一段代碼和我對結果的解釋。需要幫助瞭解指針語義

void f (int * p, int * q) 
{ 
    p = q; 
    *p = 2; 
} 

int i = 0; 
int j = 1; 

int main() 
{ 
    f(&i, & j); 

    printf("%d %d\n", i, j); 

    return 0; 
} 

我們有兩個全局變量ij,我們通過這兩個變量的函數指針f。當我們做p = q時,我們實際上放棄了i的參考,我們得到兩個指針,即pq都指向j。那麼當我們做*p = 2時,我們實際上將j的值更改爲2

然而,正如我們在步驟p = q丟失的i基準,在主程序中,獲取打印的i值是全局變量是0。因此我們得到結果爲i = 0j = 2

,請告訴我,如果這是一個正確的解釋...

現在另一個問題是,當我們在函數f做p = q,它會創建一個內存泄漏,因爲以前由p指向的價值將無法訪問。

+0

「它會創建一個內存泄漏,因爲先前由p指向的值將無法訪問......」:只有在函數f中它纔會不可用。但它仍然是主要的訪問。變量p和q只在'f'中存在,而不是在main或其他函數中。 – 2011-12-22 01:50:46

+1

[comp.lang.c FAQ](http://c-faq.com)是一個很好的資源。第4節討論指針。 – 2011-12-22 02:43:53

+0

這是一個簡單的問題...在問這裏之前檢查cfaq – 2011-12-22 05:07:43

回答

0

這樣的功能p = q只改變局部變量p,所以i不受影響,並在&imain仍調用函數之前相同。另外,如果使用malloc()calloc()而沒有相應的free()(包括等效使用realloc()),則只能存在內存泄漏。

否則,您的解釋是正確的。

+0

你實際上也可能在靜態內存中有內存泄漏:'const char * ptr =「hello」; ptr =「world」;' – Lundin 2011-12-22 07:40:54

+1

@Lundin不算作泄漏,因爲你沒有做任何事情可以「修復」它,對吧? – 2011-12-22 07:50:52

+0

就像動態內存泄漏一樣,唯一的解決方案是不要在代碼中寫入錯誤。 – Lundin 2011-12-22 07:53:10