我在函数内创建了一个二维数组,我想返回这个数组,并将它传递到其他函数中。
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;
}
char *board[16]
和 char (*board)[16]
之间的区别。前者是指针数组,而后者是指向包含16个字符的数组的指针。在大多数代码中,这并不重要,但它可能很关键。例如,如果board是一个二维字符数组,则 char *xx = (char*) board; xx [17] ='A'
将按预期工作,但如果它是一个 char *
数组,则不会。其中一个关键问题出现在全局变量和外部声明 - 它们需要匹配。 - ashclass 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++。
typedef char[16][10] TBoard;
您也可以返回
char**
...但是你需要将它强制转换为正确的大小,才能正确地对其进行索引。C++不支持动态多维数组。
另外,正如其他人所建议的那样,你不能返回堆栈上的对象(即局部变量)。
这种方法行不通。如果你返回一个指向局部变量的指针,那么会遇到未定义的行为。相反,应该使用new在堆上分配一个数组,并手动将数据复制到其中并进行索引。
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**。
话虽如此,不要这样做! 你的“board”变量在createBoard()之外不会持续存在。
使用boost::multi_array并将其作为引用传递给createBoard()或直接返回它(但如果你这样做,它将被复制)。
你不能返回指向函数局部变量的指针,因为一旦函数返回,该空间就会被覆盖。
与board关联的存储空间位于函数的栈上。