我正在开发一个简单的程序,它将获取给定变量的内存地址,最多 64 位(unsigned long)。目前这是我的代码,但出于某种原因,编译器向我发出警告,说我的方法正在返回局部变量的地址,而这正是我想要的。
int main(int argc, char *argv[])
{
char* one = argv[1];
long memaddress = address(one);
}
uint64_t address( char * strin)
{
return (uint64_t) &strin;
}
我将如何减轻此警告以及可能导致此警告出现的原因?
最佳答案
你可以想象函数定义和它的调用
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);
关于c - 函数返回局部变量的地址 [-Wreturn-local-addr],我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40613359/