【问题标题】:Creating a 2d array, one dimension not known at compile time创建一个二维数组,一维在编译时未知
【发布时间】:2013-05-09 07:05:51
【问题描述】:

我需要澄清两件事:二维数组和一个长度在运行时确定的数组。第一个长度未知,第二个已知为二。

char** mapping = new char*[2];//2d array
mapping[2][0] = 'a';

由于写入的内存未分配给数组,该程序崩溃,我该如何解决?你能解释一下你的答案吗?

【问题讨论】:

    标签: c++ multidimensional-array


    【解决方案1】:

    如果只有第一个数组大小是运行时值(其余的是编译时值),那么您可以一次性分配它。在您的情况下,对于运行时大小 n

    char (*mapping)[2] = new char[n][2];
    

    “照常”访问此数组,即mapping[i][j],其中i0..n-1 范围内,j0..1 范围内。

    但是,除非您有一些特定的效率/布局要求,否则最好使用std::vector

    【讨论】:

    • 在二维数组的意义上,我们需要做的是创建一个指针数组并将这些指针指向实际数组的起点。通常我会这样做int** ary = new int*[sizeX];for(int i = 0; i < sizeX; ++i) {ary[i] = new int[sizeY];}。现在我很好奇它是如何在一行代码char (*mapping)[2] = new char[n][2]; 中发生的。您能否解释一下,其他信息是如何发生的。
    • 这就是我所做的,但现在我无法弄清楚如何在函数签名中写入返回值,因为 n 直到运行时才知道?
    • @Celeritas:什么功能?您必须提供有关您正在尝试做的事情的更多详细信息。如果你想从一个函数中返回一个指向这个数组的指针(例如mapping),一种方法是先到typedef类型:typedef char Char2[2]。然后你可以将上面的内容重写为Char2 *mapping = new Char2[n]。然后只需使用Char2 * 作为函数返回类型并执行return mapping;。 (typedef 这个还有其他方法。)没有typedef 也可以,但是函数返回值的语法会很复杂。
    • @AndreyT 我开始了一个新问题stackoverflow.com/questions/16535256/…
    【解决方案2】:

    你需要写:

    mapping[1] = new char(1);
    mapping[1][0] = 'a';
    

    二维数组中的每一行都应单独初始化,索引从 0 开始,最大可用索引为 1,但您尝试访问第三个一维数组。

    【讨论】:

      【解决方案3】:

      只要这样做,你所有的问题都会消失:

      int size_x = 10, size_y = 20;
      char* arr = new char[size_x*size_y];
      
      char get(int x, int y) {
        return arr[x+y*size_x];
      }
      
      void set(int x, int y, char val) {
        arr[x+y*size_x]=val;
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2013-07-16
        • 2016-12-27
        • 1970-01-01
        • 1970-01-01
        • 2016-04-23
        • 2020-08-02
        • 2020-07-25
        相关资源
        最近更新 更多