我在函数内部创建了二维数组,我想返回该数组,并将其传递给其他函数..
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;
}
但这不断给我错误
答案 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)
您不能返回指向函数局部变量的指针,因为一旦函数返回,该空间就会被覆盖。
与电路板相关的存储位于功能堆栈上。