C 指针作为返回值

C 指针作为返回值,c,pointers,function-pointers,C,Pointers,Function Pointers,如果我做了一个函数,对两个变量求和,并通过指针返回求和结果 该算法可能会出现什么预期问题?如果结果在堆栈上(即在函数中本地声明),则指针将指向一个变量,该变量将在进行进一步函数调用后被覆盖 在某些情况下(即,立即从函数返回并在推送更多堆栈帧之前获取值),它可能会工作,但一般来说,这是错误的。如果结果在堆栈上(即,在函数中本地声明),然后指针将指向一个变量,一旦进行进一步的函数调用,该变量将被覆盖 在某些情况下(即,立即从函数返回并在推送更多堆栈帧之前获取值),它可能会工作,但一般来说,这是错误的

如果我做了一个函数,对两个变量求和,并通过指针返回求和结果


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

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


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

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


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

如果这样做,则没有问题:

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
}

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

这样做没有问题:

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
}
另外,您还可以使用
malloc
,将结果(
a+b
)存储在该内存中(通过将
a+b
分配给
*res
),然后返回该指针,但调用者需要释放它

预期的问题

  • 未初始化的指针

    问题:
    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
    返回时,指向已释放的无效内存,即指向位于
    add()
    堆栈上的
    c

预期的问题

  • 未初始化的指针

    问题:
    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
    返回时,指向已释放的无效内存,即指向位于
    add()
    堆栈上的
    c


未定义的行为,因为您向局部变量返回了地址。您是在询问“算法”,还是有导致问题的特定代码?因为如果你有代码,你应该向我们展示它,这样我们可以帮助你解决你的问题。展示一些代码,这样我们就不需要猜测你的问题是什么。int*sum(int x,int y){int z;z=x+y;int*p=&z;return p;}这段代码预期会出现什么问题?@Eman:我在回答中已经提到了。未定义的行为是因为您将地址返回给局部变量。您只是在问“算法”的问题,还是有任何导致问题的特定代码?因为如果你有代码,你应该把它展示给我们,这样我们就可以帮助你解决你的问题。展示一些代码,这样我们就不需要猜测你的问题是什么。int*sum(int x,int y){int z;z=x+y;int*p=&z;return p;}那代码中预期的问题是什么?@Eman:我在回答中已经提到了这一点。