【问题标题】:Printing Value From Array in C++在 C++ 中从数组中打印值
【发布时间】:2021-12-20 07:09:15
【问题描述】:

我想用 C++ 编写一个创建单调递增值数组的方法。它有 int begin、int end、int interval 的输入。

在这个例子中;方法应返回 [0,1,2,3,4,5,6,7,8,9,10] 的数组。当我打印结果时,它应该打印出前两个索引并得到 0 和 1。但是,当我打印它时,它为第一个给出 0,第二个给出 9829656。

当我只打印一个索引时它总是正确的,但是当我打印多个索引时,除了第一个打印的索引之外的每个值都会给出不同的结果。我认为其他结果与内存地址有关,因为我使用了指针。

#include <iostream>
using namespace std;

int* getIntervalArray(int begin, int end, int interval){

    int len = (end - begin) / interval + 1;

    int result[11] = {};

    for (int i = 0; i <= len - 1; i++) {
        result[i] = begin + interval * i;
    }

    return result;
}

int main(){

    int begin = 0;
    int end = 10;
    int interval = 1;

    int* newResult = getIntervalArray(begin, end, interval);

    cout << newResult[0] << endl;
    cout << newResult[1] << endl;

    return 0;

}

【问题讨论】:

  • int result[11] = {}; 是本地数组,无法返回。您需要创建动态数组 int* result = new int[11] 以便从函数中返回它。但是你需要记住delete[]那个数组,在使用之后,所以我建议在函数外部使用本地数组并传递给函数,或者new int[11]delete[]在你当前的代码之外,但它看起来更好地使用本地数组。
  • 这是你要返回的悬空指针,请参阅:stackoverflow.com/a/13132808/13113537。如果您要使用带有“new”或“malloc”的动态分配数组,还要注意内存泄漏示例。
  • @shjeff 为什么我需要删除 newResult 数组?
  • @user6210457 因为这是您正在借用的某种内存“(堆)”,并且您的程序不应窃取/消耗任何字节。通过使用delete[],您是在告诉操作系统您不再需要该内存。

标签: c++ arrays pointers methods


【解决方案1】:

将函数中的数组变量设置为static。这是因为 C++ 不支持返回局部变量的地址。

static int result[11];

【讨论】:

    【解决方案2】:

    您正在返回一个指向局部变量的指针。您可以改为按值返回 std::vector,如下所示:

    #include <iostream>
    #include <vector>
    //return a vector by value
    std::vector<int> getIntervalArray(int begin, int end, int interval){
    
        int len = (end - begin) / interval + 1;
    
        std::vector<int> result(len); //create a vector of size len
    
        for (int i = 0; i <= len - 1; i++) {
            result.at(i) = begin + interval * i;
        }
    
        return result;
    }
    
    int main(){
    
        int begin = 0;
        int end = 10;
        int interval = 1;
    
        std::vector<int> newResult = getIntervalArray(begin, end, interval);
    
        //print out elements of returned vector
        for(int i = 0; i < newResult.size(); ++i)
        {
            std::cout << newResult.at(i) << std::endl;
     
        }
        
        return 0;
    }
    

    以上程序的输出可见here

    【讨论】:

      【解决方案3】:

      一种可能的解决方案是动态分配本地数组,并通过智能指针返回它:

      #include <array>
      #include <iostream>
      #include <memory>  // make_unique
      
      auto getIntervalArray(int begin, int end, int interval)
      {
          int len = (end - begin) / interval + 1;
      
          auto result{ std::make_unique<std::array<int, 11>>() };
      
          for (int i = 0; i <= len - 1; i++) {
              (*result)[i] = begin + interval * i;
          }
      
          return result;
      }
      
      int main()
      {
          int begin = 0;
          int end = 10;
          int interval = 1;
      
          auto newResult{ getIntervalArray(begin, end, interval) };
      
          std::cout << (*newResult)[0] << std::endl;
          std::cout << (*newResult)[1] << std::endl;
          std::cout << (*newResult)[2] << std::endl;
      
          return 0;
      }
      

      Demo

      【讨论】:

        【解决方案4】:

        试试这个。还添加删除newResult

        #include <iostream>
        using namespace std;
        
        int* getIntervalArray(int begin, int end, int interval){
        
            int len = (end - begin) / interval + 1;
        
            int* result = new int[len];
            int lastValue = begin;
            for (int i = 0; i <= len - 1; i++) {
                result[i] = lastValue;
                lastValue += interval;
            }
        
            return result;
        }
        
        int main(){
        
            int begin = 0;
            int end = 10;
            int interval = 1;
        
            int* newResult = getIntervalArray(begin, end, interval);
        
            cout << newResult[0] << endl;
            cout << newResult[1] << endl;
            
            // add delete here. 
         
            return 0;
        
        }
        

        【讨论】:

        • 此解决方案是否泄漏内存?
        • 为什么需要删除newResult数组?是不是跟内存泄露有关?
        • 是的,在退出程序之前删除所有使用过的内存指针。
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2013-09-23
        • 1970-01-01
        • 2020-10-10
        • 1970-01-01
        • 2022-11-27
        • 2012-11-11
        • 1970-01-01
        相关资源
        最近更新 更多