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