C ++,在堆栈上传递2D数组以通过引用运行

时间:2013-03-10 10:55:04

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

void build()将创建一个2D数组,其大小在运行时确定,并通过引用传递给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但仍然无效。非常感谢你!

2 个答案:

答案 0 :(得分: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<std::vector<bool>>很适合你:

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);
}

现在你甚至不必传递大小。

答案 1 :(得分:0)

以这种方式使用:

    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; 
    }