【问题标题】:Declaring in an header a dynamically allocated 2 dimensional array without knowing its dimensions在标题中声明一个动态分配的二维数组而不知道它的维度
【发布时间】:2013-05-22 09:32:23
【问题描述】:

我需要在头文件中声明一个动态分配的二维数组,而不知道它的维度,这将在函数内部建立。

在我要放置的标题中:

#define MAX_BARS_ALLOWED 20000
extern int Gregorian[][MAX_LINES_ALLOWED];  //it works

.cpp 文件中的函数内部:

int **Gregorian=new int*[NumLastItem+1][MAX_LINES_ALLOWED];  //this does NOT work, why ?

...由于我在函数中对其进行了初始化,所以它真的是全局的吗?

谁能教我正确的方法来做到这一点?提前谢谢你!!

【问题讨论】:

    标签: c++ dynamic-allocation


    【解决方案1】:

    如果您在函数内创建具有相同名称的数组的新实例,它将覆盖并隐藏上一个。您可以分配外部数组,但不要创建具有相同名称的新变量。

    【讨论】:

      【解决方案2】:

      这是我最喜欢的在堆上声明可变大小矩阵的方法:在每一行的末尾分配一个额外的元素,以便知道边界在哪里(有点像 C 风格的字符串)。

      int** read_matrix(int size_x, int size_y)
      {
          int** matrix;
          matrix = calloc(size_x, 1+sizeof(int*)); // alloc one extra ptr
          for(int i = 0;i<size_x;i++) {
              matrix[i] = calloc(size_y, sizeof(int));
          }
          matrix[size_x] = NULL; // set the extra ptr to NULL
      
          /* populate the matrix if needed
          for(int i = 0;i<size_x;i++) {
              for(int j = 0;j<size_y;j++) {
                  matrix[i][j] = i*10+j;
              }
          }
          */
          return matrix;
      }
      
      // keep looping until you find the NULL one
      for( int i=0; first_matrix[i] != NULL; i++ ) {
          free( first_matrix[i] );
      }
      free( first_matrix );
      

      这个 sn-p 是从那里复制的:int matrix with pointers in C - memory allocation confusion

      用法:

      在标题中:

      #define MAX_BARS_ALLOWED 2000
      extern int** Gregorian;
      

      在 cpp 中:

      Gregorian = read_matrix(NumLastItem+1,MAX_LINES_ALLOWED);
      

      【讨论】:

      • 不,它不是一个可变大小的矩阵,我必须在其中添加元素。我想:在标头中将其声明为全局,并且一旦在函数内部,该函数将一劳永逸地计算其第一个维度并对其进行初始化(解决方案 1)。有可能吗?是的,或者我可以在标题和文件 .cpp 中用错误的尺寸声明它,然后在函数内调整它的大小(解决方案 2),但首先我想了解是否可以让解决方案 1 工作。还是谢谢
      • @georgesl 感谢您的回答,但是,为了完成我对这个主题的教育,我应该怎么做才能调整已经声明和动态分配的二维数组的大小?
      • @alwaysstudent :调整动态分配矩阵的大小真的很痛苦(你不能像任何一维数组一样重新分配,因为它会覆盖下一行的值)。为此,您必须 malloc 新数组,将值从旧数组复制到新数组,并修改每个指针以指向新数组。更好地使用 STL 容器,如 vector、valarray 或 Boost::Matrix
      【解决方案3】:

      在你的头文件中对实现源有一个特殊的定义。像这样:

      #ifndef ARRAY_HEADER_HPP
      #define ARRAY_HEADER_HPP 1
      
      #ifdef ARRAY_IMPL
      #define extern // remove extern for implementation
      #endif
      
      #define MAX_LINES_ALLOWED 20000
      extern int **Georgian;
      
      #ifdef ARRAY_IMPL
      #undef extern
      #endif
      
      #endif // ARRAY_HEADER_HPP
      

      然后在分配数组的地方包含这样的标题

      #define ARRAY_IMPL
      #include "array_header.hpp"
      
      void alloc_array(){
          Georgian = new int*[var+1];
          for(size_t n = 0; n < (var+1); n++)
              Georgian[n] = new int[MAX_LINES_ALLOWED];
      }
      
      void dealloc_array(){
          for(size_t n = 0; n < (var+1); n++)
              delete[] Georgian[n];
          delete[] Georgian;
      }
      

      【讨论】:

      • 如果投反对票的人也能就原因发表评论,那就太好了。
      猜你喜欢
      • 2018-03-26
      • 2016-01-12
      • 1970-01-01
      • 2021-01-02
      • 1970-01-01
      • 1970-01-01
      • 2013-03-24
      • 2013-11-24
      相关资源
      最近更新 更多