我正在开发一个简单的程序,它将获取高达64位(无符号长整数)的给定变量的内存地址。目前这是我的代码,但由于某些原因,编译器向我发出警告,说我的方法是返回本地变量的地址,这是我想要的。
int main(int argc, char *argv[])
{
char* one = argv[1];
long memaddress = address(one);
}
uint64_t address( char * strin)
{
return (uint64_t) &strin;
}
我如何减轻此警告以及可能导致此警告的原因?
答案 0 :(得分:2)
当strin
返回时,参数address
是address
函数的本地参数,不再存在,使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
的位置。