作为 return 值的指针

Pointers as a return value

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

该算法可能会发生哪些预期问题?

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

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

如果你这样做没问题:

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),然后 return 该指针,但是那么调用者需要释放它。

the expected problems

  • 未初始化的指针

    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 分 "nowhere"。

  • 内存对齐不当

    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() 的堆栈上。