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

标签 c pointers

我正在开发一个简单的程序,它将获取给定变量的内存地址,最多 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/

相关文章:

c - 为什么输出包含 4 个 0?

c - 增量队列 - 嵌入式调度程序

排序 3 个随机数的 C 程序,void reorder3(int a, int *b, int **c);

c - 给定一个 32 位无符号随机数,如何在一定范围内操作值 [low, high]?

pointers - 扫描不工作

pointers - golang 中的 Null 与 nil?

c - 如何在不使用 for 循环的情况下获取 char * 变量的大小?

c - 警告 : ‘struct user_data_s’ declared inside parameter list

pointers - 解码嵌套结构和类型断言

C++ 函数调用后无关指针发生变化