2016-11-15 182 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功能无效,因此,该警告。