函数返回局部变量的地址[-Wreturn-local-addr]

时间:2016-11-15 15:13:19

标签: c pointers

我正在开发一个简单的程序,它将获取高达64位(无符号长整数)的给定变量的内存地址。目前这是我的代码,但由于某些原因,编译器向我发出警告,说我的方法是返回本地变量的地址,这是我想要的。

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

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

我如何减轻此警告以及可能导致此警告的原因?

4 个答案:

答案 0 :(得分:2)

strin返回时,参数addressaddress函数的本地参数,不再存在,使main中的指针值无效功能,因此警告。

答案 1 :(得分: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);

答案 2 :(得分:0)

strin是一个由address中的值传递的指针。

您实际上是在尝试返回该地址,尽管已经转换为其他类型。

但是一旦函数退出,strin的地址将不再有效,并且友好的编译器会警告你。

解决方案是使用void*作为地址,而不是为完全不同的东西设计的某种类型。

答案 3 :(得分:0)

当您将变量传递给函数时,它会创建变量的副本并将其传递给您调用的函数作为局部变量。如果您返回此变量的地址,您将获得您从返回的函数的本地变量的位置。也就是说,在此示例中,您不会获得one变量的位置,而是strin的位置。