指针作为返回值

时间:2015-09-02 17:38:33

标签: c pointers function-pointers

如果我创建了对两个变量求和的函数并通过指针返回求和结果。

该算法可能会出现什么问题?

3 个答案:

答案 0 :(得分:2)

  

预期的问题

  • 未初始化的指针

    void add(int a, int b, int * pc)
    {
      *pc = a + b;
    }
    
    int main(void)
    {
      int a = 1;
      int b = 2;
      int * pc;
    
      add(a, b, pc);
    
      ...
    

    问题:pc点"无处"。

  • 内存严重错误

    void add(int a, int b, int * pc)
    {
      *pc = a + b;
    }
    
    int main(void)
    {
      int a = 1;
      int b = 2;
      char c[sizeof (int)];
    
      add(a, b, c); /* or even add(a, b (int*) c); */
    
      ...
    

    问题:虽然足够大,c的内存可能无法正确对齐以容纳int

  • 内存无效

    void add(int a, int b, int * pc)
    {
      int c = a + b;
      pc = &c;
    }
    
    int main(void)
    {
      int a = 1;
      int b = 2;
      int * pc;
    
      add(a, b, pc);
    
      ...
    

    问题:从add() pc点返回到无效内存,已经取消分配,即生成c堆栈的add()。< / p>

答案 1 :(得分:1)

如果结果在堆栈上(即在函数中本地声明),那么指针将指向一个变量,一旦进一步调用函数,它将被覆盖。

它似乎可以在某些情况下工作(即,在推送更多堆栈帧之前立即从函数返回并获取值) - 但一般来说这是错误的/错误的。

答案 2 :(得分:1)

如果你这样做会没问题:

void sum(int a, int b, int *res)
{
  *res = a+b;  
}

,例如调用:

 int x;
 sum(5, 6, &x);

但是以下是不正确的:

int* sum(int a, int b)
{
  int *res;
  int x = a+b;
  res = &x;
  return res;// returning address of x - but x is not alive when function ends; don't do it
}

PS。您也可以使用malloc,将结果(a+b)存储在该内存中(通过将a+b分配给*res),然后返回该指针,但调用者将会需要释放它。