获取C中函数的返回地址

时间:2016-11-23 05:22:46

标签: c function gcc memory-address built-in

我有一些基本上看起来像

的C代码
double* my_function(double* input) {
    double* output = (double*) malloc(...);
    // Do some stuff to output based on input
    return output;
}

假设我已经构建了一个名为 my_var_in 的数组,我的主代码就像

double* my_var_out = my_function(my_var_in);

这会创建新的内存, my_var_out 指向该内存;大多数时候,这正是我想要发生的事情。但是,有时我只想更新已经存在的内存。如果我写

double* my_var = ... ; // allocate and fill my_var as desired
my_var = my_function(my_var);

然后我丢失了指向先前存在的内存的指针,因为 my_var 现在指向新分配的内存。我已经玩了几个不同的想法,如何解决这个问题。

1)我知道我可以通过将函数样式更改为

来实现此功能
void my_function(double* destination, double* source) {
    // Check if destination == source and update based on this

我以前开发过这种将目标指针作为输入参数传递并在那里更新的方式;它在功能上运行得很好,但我喜欢更好地输出指针的风格,并希望继续使用它。

2)基于herehere,似乎 __ builtin_return_address 功能可能会有所帮助。我想我可以使用这个函数来比较输入地址和输出地址,并根据它进行分配/更新。阅读文档here后,我编写了以下测试

int* just_testing(int* in) {
    void* ptr = __builtin_return_address(0); // the return address of just_testing
    printf("Input address: %p\n", in);
    printf("From function: %p\n", ptr);

    return in;
}

int main(int argc, char** argv) {

    int* out = (int*) malloc(sizeof(int));
    out[0] = 2;
    printf("From main before call: %p\n", out);
    out = just_testing(out);
    printf("From main after call: %p\n", out);

    return 0;
}

这给了我输出

From main before call: 0x19b2010
Input address: 0x19b2010
From function: 0x4011f1
From main after call: 0x19b2010

不幸的是, __ builtin_return_address 的结果与从函数接收返回的变量的地址不匹配,这是我没想到的。

为什么地址不一样?除了我在这里列出的两个方法之外,我也欢迎任何建议性的建议。

2 个答案:

答案 0 :(得分:1)

最干净的解决方案是拥有两个独立的功能:

#include <stdlib.h>
#include <string.h>

void compute_inplace(double *data) {
    data[0] *= 2;
}

double *compute_copying(const double *input) {
    double *output = malloc(sizeof *output * N);
    if (output == NULL)
        return NULL;

    memcpy(output, input, sizeof *output * N);
    compute_inplace(output);
    return output;
}

请注意,复制函数将其参数作为指向const 的指针,如果您不小心将只读内存区域传递给它,这会有所帮助。

答案 1 :(得分:0)

其他可能的解决方案可能是以下定义: -

double* my_function(double* input, bool alloc)
{
   double* output = input;

   if(alloc)
   {
       //allocate new memory
       double* output = ( double*)malloc(...);
   }
   //else work with input memory

   //do modifications here

   return output;
}