0

我的函数是否有未定义的行为?因为有局部变量c,所以它在自动位置,所以它会在函数执行后被破坏?(范围结束)

int* calculate(int* a,int* b)
{
  int c=(*a)+(*b);  //local variable c
  return &c;
}
int main()
{
  int a=12;
  int b=23;
  int* ptr=calculate(&a,&b);
  std::cout<<*ptr<<endl;
}
4

2 回答 2

2

是的,返回指向临时本地对象的指针并取消引用未定义的行为

因为退出函数后calculate,该对象超出范围并自动销毁,然后提供的指针指向无效地址,它是一个悬空指针。之后,您可以使用取消引用并使用它(例如:)*ptr

在您的情况下,您可以使用普通变量,删除那些*

int calculate(int *a, int *b)
{
  int c = (*a)+(*b);
  return c;
}

由于您没有任何合理的理由通过指针传递它们,因此最好删除更多*

int calculate(int a, int b)
{
  int c = a + b;
  return c;
}
于 2013-10-21T07:21:52.993 回答
1

您可以将 ,int中的声明传递maincalculate, 如下所示::

void calculate(int* a,int* b, int* c)
{
  *c=(*a)+(*b); 
  return ;
}
int main()
{
  int a=12;
  int b=23;
  int c=0;
  calculate(&a,&b,&c);
  std::cout<<c<<endl;
  return 0;
}

更简单的方法是::

int Calculate( int a, int b )
{
    return a+b ;
}
int main( void )
{
    int a=12, b=23;
    std::cout<<Calculate(a,b)<<endl;
    return 0;
}
于 2013-10-21T07:24:13.923 回答