我在函数内部创建了二维数组,我想返回该数组,并将其传递给其他函数。
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;
}
但这一直给我错误
我在函数内部创建了二维数组,我想返回该数组,并将其传递给其他函数。
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;
}
但这一直给我错误
是的,看看你在做什么是返回一个指向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;
}
最好的方法是创建一个板类并将 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++。
这种方法行不通。如果您返回指向局部变量的指针,您将遇到未定义的行为。而是在堆上分配一个带有新的数组并将数据复制到其中手动索引它。
我真的建议为此使用 STL vector<> 或 boost/multi_array 容器。
如果必须使用数组,那么我建议使用 typedef 来定义数组。
typedef char[16][10] TBoard;
你也可以返回
char**
...但是您需要将其类型转换为正确的大小才能正确索引它。C++ 不支持动态多维数组。
也正如其他人所建议的那样,您不能返回堆栈上的对象(即局部变量)
如其他提到的,不要返回指向局部变量的指针。如果我被迫做你想做的事,首先我会选择 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;
}
}
}
你应该返回char**
而不是char*
您的问题的简单答案是 char**。
话虽如此,不要这样做!您的“板”变量不会持续到 createBoard() 之外。
使用boost::multi_array并将其作为引用传递给 createBoard() 或直接返回(但如果这样做,它将被复制)。
您不能返回指向函数局部变量的指针,因为一旦函数返回,该空间就会被覆盖。
与板相关的存储在函数的堆栈上。