【问题标题】:C++, Passing a 2D array on stack to function by referenceC ++,将堆栈上的二维数组传递给引用函数
【发布时间】:2013-03-10 10:55:03
【问题描述】:

void build() 将创建一个大小在运行时确定的二维数组,并通过引用将其传递给modify()

void modify() 将对数组进行一些更改。

.h 文件:

void modify(______, int mySize);
void build(int size);

在 .cpp 文件中:

void modify(______, int mySize) {
    for (int i = 0; i < mySize; i++) 
        for (int j = 0; j < mySize; j++)
            myArray[i][j] = false;
}

void build(int size) {
    bool myArray[size][size];
    modify(______, size);
}

谁能告诉我在这些空白处填什么?我尝试了很多方法来投射myArray,但仍然无法正常工作。非常感谢!

【问题讨论】:

  • 编写一个表示二维数组的类,使用单个 std::vector 向量来保存数据。
  • 杰克,感谢您的链接。但是我的size 直到build() 被调用时才知道。编译器说“.h:错误:'size'没有在这个范围内声明”。
  • 可变长度数组是非标准的。 bool myArray[size][size]; 使用编译器扩展。
  • 你能说得更具体点吗?

标签: c++ arrays pass-by-reference


【解决方案1】:

首先,请注意可变长度数组 (VLA) 不是标准 C++。这一行编译的事实是由于 GCC 编译器扩展:

bool myArray[size][size];

它根本不是有效的 C++。数组的维度需要是编译时常量,但在这里您使用的是传递给函数 build 的参数。

无论如何,要将 VLA 传递给函数,您必须继续使用编译器扩展。但是,据我测试,这些仅在编译为 C 时有效。第一个选项使用允许在其他参数声明中使用参数的扩展:

void modify(int mySize, bool array[][mySize]);

第二个选项,如果您希望mySize 成为第二个参数,也使用允许前向声明参数的编译器扩展:

void modify(int mySize; bool array[][mySize], int mySize);

这里int mySize;是参数前向声明。

尽管如此,您确实不应该使用可变长度数组。您可以动态分配可变长度的数组,如下所示:

void modify(bool** array, int mySize);

void build(int size) {
  bool** myArray = new bool*[size];
  for (int i = 0; i < size; i++) {
    myArray[i] = new bool[size];
  }
  modify(myArray, size);
}

但是,这仍然不是 C++ 中推荐的做法。你应该避免动态分配,除非你真的需要它,当你确实需要它时,你应该以某种方式管理它。在这里,您需要记住delete[] myArray 的每个元素 myArray 本身。

您真正应该使用的是标准容器。 std::vector&lt;std::vector&lt;bool&gt;&gt; 在这里很适合你:

void modify(std::vector<std::vector<bool>>& array);

void build(int size) {
  std::vector<std::vector<bool>> myArray(size, std::vector<bool>(size));
  modify(myArray);
}

现在您甚至不必传递尺寸。

【讨论】:

  • 非常感谢!顺便说一句void modify(std::vector&lt;std::vector&lt;bool&gt;&gt; &amp; array); 会通过引用传递
  • @user2153561 当然!我完全没有意识到modify 函数会修改它的参数。
【解决方案2】:

这样使用:

    void modify(bool**& myArray, const int mySize) 
    {
        for (int i = 0; i < mySize; i++) 
            for (int j = 0; j < mySize; j++)
               myArray[i][j] = false;
    }

    void build(const int size) 
    {
        // create the array
        bool** myArray = new bool*[size];
        for (int i=0; i<size; i++)
            myArray[i] = new bool[size];

        modify(myArray, size);

        // release the array
        for (int i=0; i<size; i++)
            delete[] myArray[i];
        delete[] myArray; 
    }

【讨论】:

    猜你喜欢
    • 2023-04-04
    • 2021-05-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多