10

我在函数内部创建了二维数组,我想返回该数组,并将其传递给其他函数。

char *createBoard( ){  
  char board[16][10];
  int j =0;int i = 0;
  for(i=0; i<16;i++){
        for( j=0;j<10;j++){   
                board[i][j]=(char)201;
        }   
  }
  return board;
}

但这一直给我错误

4

8 回答 8

11

是的,看看你在做什么是返回一个指向board在堆栈上创建的对象(称为数组)的指针。数组超出范围时将被销毁,因此指针不再指向任何有效对象(悬空指针)。

您需要确保将数组分配在堆上,使用new. 在现代 C++ 中创建动态分配数组的神圣方法是使用类之std::vector类的东西,尽管这里更复杂,因为您正在尝试创建 2D 数组。

char **createBoard()
{
    char **board=new char*[16];
    for (int i=0; i<16; i++)
    {
       board[i] = new char[10];
       for (int j=0; j<10; j++)
         board[i][j]=(char)201;
    }

    return board;
}

void freeBoard(char **board)
{
    for (int i=0; i<16; i++)
      delete [] board[i];
    delete [] board;
}
于 2009-04-06T09:15:49.917 回答
11

最好的方法是创建一个板类并将 ctreateBoard 函数作为其构造函数:

class Board {
  private:
   char mSquares[16][10];

   public:
    Board() {
        for(int i=0; i<16;i++){
        for( int j=0;j<10;j++){   
                mSquares[i][j]=201;
        }       
    }

   // suitable member functions here
 };

有关如何使用此类课程的信息,没有什么可以替代阅读一本好书。我强烈推荐Andrew Koenig 和 Barbra Moo 的Accelerated C++

于 2009-04-06T09:21:21.153 回答
2

这种方法行不通。如果您返回指向局部变量的指针,您将遇到未定义的行为。而是在堆上分配一个带有新的数组并将数据复制到其中手动索引它。

于 2009-04-06T09:15:21.713 回答
2

我真的建议为此使用 STL vector<> 或 boost/multi_array 容器。

如果必须使用数组,那么我建议使用 typedef 来定义数组。

typedef char[16][10] TBoard;

你也可以返回

 char**

...但是您需要将其类型转换为正确的大小才能正确索引它。C++ 不支持动态多维数组。

也正如其他人所建议的那样,您不能返回堆栈上的对象(即局部变量)

于 2009-04-06T09:17:32.770 回答
1

如其他提到的,不要返回指向局部变量的指针。如果我被迫做你想做的事,首先我会选择 std::vector。由于您还没有学习 std::vector,这里还有另一种方法:

void createBoard(char board[16][10])
{  
  int j =0;int i = 0;
  for(i=0; i<16;i++){
        for( j=0;j<10;j++){   
                board[i][j]=(char)201;
        }       
  }
}
于 2009-04-06T10:05:49.783 回答
0

你应该返回char**而不是char*

于 2009-04-06T09:11:49.367 回答
0

您的问题的简单答案是 char**。

话虽如此,不要这样做!您的“板”变量不会持续到 createBoard() 之外。

使用boost::multi_array并将其作为引用传递给 createBoard() 或直接返回(但如果这样做,它将被复制)。

于 2009-04-06T09:16:12.397 回答
0

您不能返回指向函数局部变量的指针,因为一旦函数返回,该空间就会被覆盖。

与板相关的存储在函数的堆栈上。

于 2009-04-06T09:17:50.770 回答