c++ - 我的代码是未定义的行为吗

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

最佳答案

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

因为在退出函数 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/

相关文章:

c++ - 这种类型的初始化叫什么?

c++ - 知道为什么这个用户定义的文字会失败吗?

c++ - 函数模板的显式实例化何时发生实例化

performance - Scala 在素数算法上的性能

c++ - C++中的多态和指针数组问题

如果使用自定义类类型作为键,C++ unordered_set 的计数和查找将不起作用

c++ - 经典 ASP 和 ITaskScheduler 访问被拒绝错误

c - 读取内部具有不同字节长度值的二进制文件

c++ - 指定一个可以绑定(bind)到函数模板的模板参数

c++ - 为什么这个函数的递归版本更快?