2016-11-15 188 views
0

我正在研究一個簡單的程序,該程序將獲取給定變量的內存地址,最多爲64位(無符號長整數)。目前這是我有的代碼,但由於某種原因,編譯器正在向我發出警告,說我的方法正在返回本地變量的地址,這是我的意圖。函數返回本地變量的地址[-Wreturn-local-addr]

int main(int argc, char *argv[]) 
{ 
char* one = argv[1]; 
long memaddress = address(one); 
} 

uint64_t address(char * strin) 
{ 
     return (uint64_t) &strin; 
} 

我該如何緩解此警告,並且可能會導致此警告出現?

+0

這是一個小的功能,爲什麼不報警;噸你去MACRO? –

+4

@SouravGhosh:從不使用函數可以工作的宏。但那也是無稽之談。 – Olaf

+0

@Olaf,你打算做什麼?我計劃在地址函數中實現更多功能,但我會盡量簡單地提出問題。我將如何將地址傳遞給main? – WasabiCannon

回答

2

你能想象的功能定義和其呼叫

long address = address(one); 
//... 
uint64_t address(char * strin) 
{ 
     return (uint64_t) &strin; 
} 

通過以下方式

long address = address(one); 
//... 
uint64_t address(void) 
{ 
     char * strin = one; 
     return (uint64_t) &strin; 
} 

正如你看到的變量strin是函數的局部變量。它退出該功能後將被銷燬。因此退出該功能後的地址將無效。編譯器會對此提出警告。

爲避免你可以寫的功能至少包括以下方式

uint64_t address(char ** strin) 
{ 
     return (uint64_t) &*strin; 
} 

,並調用它像

long address = address(&one); 
0

strin是在address中按值傳遞的指針。

你基本上試圖返回那個地址,雖然被轉換成不同的類型。

但是一旦函數退出,strin的地址將不再有效,並且您友好的編譯器會警告您。

解決方法是使用void*作爲地址,而不是爲完全不同的東西設計的某種類型。

0

當您將該變量傳遞給該函數時,它將創建該變量的副本並將其傳遞給您作爲局部變量調用的函數。如果你返回這個變量的地址,你將得到你從返回的函數的局部變量的位置。也就是說,在這個例子中,你不會得到one變量的位置,而是strin

2

參數strin是本地address功能和停止存在時返回address,使該指針值在main功能無效,因此,該警告。