<分区>
我的函数是否有未定义的行为?因为有局部变量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;
}
<分区>
我的函数是否有未定义的行为?因为有局部变量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;
}
关于c++ - 我的代码是未定义的行为吗,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19488317/