我的函数是否有未定义的行为?因为有局部变量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;
}
是的,返回指向临时本地对象的指针并取消引用未定义的行为。
因为退出函数后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;
}
您可以将 ,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;
}