C++ 指针索引:获取意外值

C++ 指针索引:获取意外值,c++,loops,pointers,memory,indexing,C++,Loops,Pointers,Memory,Indexing,但是,它会打印没有任何意义的随机整数值,至少在第一个整数值之后。在通过调试器运行代码之后,ptr地址在main方法中第一次运行for循环之后立即被删除,我无法理解为什么。此外,我不知道f()方法的用途是什么,我认为它不应该改变任何东西,但当我从主函数中删除它时,第一个值会准确返回(后面的所有值都是错误的)。发生了什么事?尝试以下方法: 1 4 9 16 25 36 49 64 81 100 int*计算平方(int&n){ int*arr=新的int[10]; n=10; 对于(int k=

但是,它会打印没有任何意义的随机整数值,至少在第一个整数值之后。在通过调试器运行代码之后,ptr地址在main方法中第一次运行for循环之后立即被删除,我无法理解为什么。此外,我不知道f()方法的用途是什么,我认为它不应该改变任何东西,但当我从主函数中删除它时,第一个值会准确返回(后面的所有值都是错误的)。发生了什么事?

尝试以下方法:

1 4 9 16 25 36 49 64 81 100 
int*计算平方(int&n){
int*arr=新的int[10];
n=10;
对于(int k=0;k
computeSquares完成运行后,释放内存“int arr[10]”

试试这个:

1 4 9 16 25 36 49 64 81 100 
int*计算平方(int&n){
int*arr=新的int[10];
n=10;
对于(int k=0;k

computeSquares完成运行后,释放内存“int arr[10]”

您得到这个结果是因为您误解了基本的语言功能。除了MsrButterfly的回答,他已经指出了最重要的问题,让我给你以下建议:

  • 忘记使用原始指针;这是一种危险的做法,很难维护和扩展,并且肯定会导致您编写内存泄漏的代码。您最好看一看一些STL文档,这些文档拥有std::vector容器,您可以使用它来代替数组arr
  • 您的computeSquares方法是危险的,因为您将变量n作为一个参数,该参数应该是数组的大小。在您的方法中,首先使用硬编码大小10定义arr,然后设置n=10;我建议您避免这种构造,因为在本例中,您需要维护两个依赖于数字10的变量
      您之所以得到这个结果,是因为您误解了基本的语言功能。除了MsrButterfly的回答,他已经指出了最重要的问题,让我给你以下建议:

      • 忘记使用原始指针;这是一种危险的做法,很难维护和扩展,并且肯定会导致您编写内存泄漏的代码。您最好看一看一些STL文档,这些文档拥有std::vector容器,您可以使用它来代替数组arr
      • 您的computeSquares方法是危险的,因为您将变量n作为一个参数,该参数应该是数组的大小。在您的方法中,首先使用硬编码大小10定义arr,然后设置n=10;我建议您避免这种构造,因为在本例中,您需要维护两个依赖于数字10的变量
      谢谢MsrButterfly,您的解决方案显然有效。但是,有没有不使用动态阵列的解决方案?我不知道动态数组,直到一个朋友告诉我,所以我不确定我是否可以使用它们。我很感激你解决了这个问题,我也能理解为什么它能通过debugger@RawN是正确的,很抱歉描述不准确。我的意思是,原始代码中的变量将在代码超出函数作用域后自动释放。@jaytrinitron:您应该在函数调用之前分配内存,并传递一个指向函数的指针,如void computeSquares(int&n,int*arr),或者只使用C++标准库容器,如STD::AldSt:STD::vector.Thanks MsrButterfly,你的解决方案显然是有效的。但是,有没有不使用动态阵列的解决方案?我不知道动态数组,直到一个朋友告诉我,所以我不确定我是否可以使用它们。我很感激你解决了这个问题,我也能理解为什么它能通过debugger@RawN是正确的,很抱歉描述不准确。我的意思是,原始代码中的变量将在代码超出函数作用域后自动释放。@jaytrinitron:您应该在函数调用之前分配内存,并传递一个指向函数的指针,如void computeSquares(int&n,int*arr),或者只使用C++标准库容器,比如STD::Stal:St::VCCTORE。答案对提问者来说确实很有帮助。但我的绰号是MsrButterfly,不是MrsButterfly。听起来像个老妇人(你的回答对提问者很有帮助。但我的绰号是MsrButterfly而不是MrsButterfly。听起来像个老妇人。)(
      int *computeSquares(int &n) {
          int *arr = new int[10];
          n = 10;
          for (int k = 0; k < n; k++)
              arr[k] = (k + 1) * (k + 1);
          return arr;
      }