2014-06-18 47 views
-2

我想返回函數func()中變量k的地址。這是2個功能。嘗試返回函數中局部變量的地址

主()功能

#include <stdio.h> 

main() 
{ 
    int* j; 
    int* func(); 

    j= func(); 
    printf("\n%d",*j); 
} 


FUNC()功能

int* func() 
{ 
    static int k=30; 
    return (&k); 
} 


我想int *func()返回的k地址,但顯示以下錯誤。

function returns address of local variable [-Wreturn-local-addr]

return (&k);

+1

的'生命k'結束函數返回時。你將如何處理不再存在的東西的地址?另外,main()是什麼? –

+0

咦?現在代碼有一個'static int k;',我猜它原本沒有,並且完全改變了事情。很混亂。 – unwind

+0

是的,我編輯它。我完全對不起我的錯誤。 @unwind – barnes

回答

3

k是誰只存在於功能func內的局部變量。
所以你要返回k不存在的地址。
它是undefined behavior

你可以爲k動態分配內存空間:

int *k = (int*)malloc(sizeof(int)); 
*k = 30 
return k; 

不要忘記釋放內存在main

free(j); 
+0

使變量'k'靜態會發生什麼? – barnes

+0

然後只要程序存在,就存在'k'。你也可以返回靜態變量的地址。 – cppcoder

+0

非常感謝。 – barnes

2

這是不是一個錯誤,這是一個警告。你仍然不應該這樣做,因爲一旦局部變量超出範圍(就像返回的情況一樣),它就會邏輯地佔據存在的地位,不應該被用於不可預知行爲的懲罰。

+0

如果我讓變量'k'靜態會怎樣。會發生什麼? – barnes

+0

然後它變成全局可見性限制,而不是**範圍局部變量。在這種情況下,它是完全有效的代碼,不太清楚你想實現什麼。 –

+0

當您將k靜態化時,它將它放置在全局變量所在的同一區域。它會給你你想要達到的目標,但是分配內存,從調用函數傳遞一個指針或者其他類似的解決方案要好得多。 – Happington

0

嘗試

int* func() 
{ 
    static int k=30; 
    return &k; 
} 
+0

在這一點上,你只是一個全球性的.... – Happington

+0

這看起來像試驗和錯誤。嘿,試試別的。它使警告消失,所以它一定是你想要的。 –

相關問題