如何返回二维char数组c ++?

时间:2009-04-06 09:05:46

标签: c++ arrays multidimensional-array

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

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

但这不断给我错误

8 个答案:

答案 0 :(得分: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;
}

答案 1 :(得分:11)

最好的方法是创建一个board类并使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++

答案 2 :(得分:2)

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

答案 3 :(得分:2)

我真的建议使用STL vector&lt;&gt;或者用于此的boost / multi_array容器。

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

typedef char[16][10] TBoard;

您也可以返回

 char**

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

另外正如其他人所建议你不能在堆栈上返回一个对象(即局部变量)

答案 4 :(得分: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;
        }       
  }
}

答案 5 :(得分:0)

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

答案 6 :(得分:0)

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

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

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

答案 7 :(得分:0)

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

与电路板相关的存储位于功能堆栈上。