是我的代码未定义的行为

时间:2013-10-21 07:17:29

标签: c++ c++11

我的功能是否有未定义的行为?因为有局部变量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;
}

2 个答案:

答案 0 :(得分: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;
}

答案 1 :(得分:1)

您可以将int中声明的main传递给calculate,就像这样::

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;
}