如何取消引用函数返回的指针?

How to dereference the pointer returned by a function?

#include <stdio.h>

int *sum_returning_pointer(int *x, int *y)
{
    // Call be reference
    int z = (*x) + (*y);
    return &z;
}

void main(int *argc, char *argv[])
{
    int a = 1, b = 2;
    int *p = sum_returning_pointer(&a, &b);
    printf("Sum = %d\n", *p);
}

使用上述函数,我试图将作为引用传递给被调用函数的两个数字相加,并返回指向存储总和的变量的指针。但是我说的是奇怪的错误。

Error has occured.
Segmentation Fault.

What does this error mean? How can i achieve a solution ? Why does this error occurs ?

在 main 函数中 z 不可访问,这就是它显示未定义行为的原因。您可以将 z 声明为全局变量,例如

#include <stdio.h>
int z =0;
int * sum_returning_pointer(int *x, int *y)
{
// Call be reference
z = (*x) + (*y);
 return &z;
 }

  void main(int *argc, char *argv[])
  {

   int a = 1, b = 2;
   int *p = sum_returning_pointer(&a, &b);
   printf("Sum = %d\n", *p);
   }

问题不在于如何解除引用,而在于如何确保指针有效。在您的代码中,返回了局部变量的地址。当程序 returns 来自函数时,此变量的生命周期结束。之后取消引用此指针会调用 Undefined Behavior.

请注意,像 int 这样的小对象通常应该按值返回。

有 3 种从函数返回指向结果的指针的通用策略。

  1. (IMO,最好)让调用者处理生命周期。
int *foo(const int *x, const int *y, int *z) {
  *z = *x + *y;
  return z;
}

用法:

int x = 1, y = 2, z;
int *res = foo(&x, &y, &z);
  1. 使用动态存储
int *foo(const int *x, const int *y) {
  int *z = malloc(sizeof *z);
  if (!z) {
    // complain
    return NULL;
  }
  *z = *x + *y;
  return z;
}

此解决方案往往非常缓慢且容易出错,因为调用者负责释放结果。

  1. 使用静态。
int *foo(const int *x, const int *y) {
  static int z;
  z = *x + *y;
  return &z;
}

效果很好,因为静态变量的生命周期会在程序的整个执行过程中延长。

主要问题是指针指向的对象会随着foo的每次调用而改变。这对于多线程应用程序尤其危险。