Подтвердить что ты не робот

Как вернуть двухмерный массив char С++?

Я создал двухмерный массив внутри функции, я хочу вернуть этот массив и передать его где-то другой функции.

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

но это продолжает давать мне ошибку

4b9b3361

Ответ 1

Да, посмотрите, что вы делаете, возвращается указатель на объект (массив с именем board), который был создан в стеке. Массив уничтожается, когда он выходит из области видимости, поэтому указатель больше не указывает на какой-либо действительный объект (висячий указатель).

Вам нужно убедиться, что массив будет выделен в куче, используя new. Освященный метод создания динамически выделенного массива в современном С++ - это использовать что-то вроде класса 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;
}

Ответ 2

Лучший подход - создать класс платы и сделать его конструктором 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.

Ответ 3

Этот подход не будет работать. Если вы вернете указатель на локальную переменную, вы столкнетесь с поведением undefined. Вместо этого выделите массив в кучу с новыми и скопируйте данные в него, указав его вручную.

Ответ 4

Я бы рекомендовал использовать для этого контейнеры STL vector < > или boost/multi_array.

Если вы должны использовать массивы, тогда я бы рекомендовал использовать typedef для определения массива.

typedef char[16][10] TBoard;

Вы также можете вернуться

 char**

... но тогда вам нужно будет привести его к правильному размеру, чтобы правильно его проиндексировать. С++ не поддерживает динамические массивы с несколькими измерениями.

Также, как и другие, вы не можете вернуть объект в стек (то есть локальную переменную)

Ответ 5

Не возвращайте указатель на локальную переменную, как указано в других. Если бы я был вынужден делать то, что вы хотите достичь, сначала я бы пошел на 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;
        }       
  }
}

Ответ 6

Вы должны вернуть char** вместо char*

Ответ 7

Простой ответ на ваш вопрос: char **.

Сказав это, НЕ ДЕЛАЙТЕ ЭТО! Ваша переменная "board" не будет существовать вне createBoard().

Используйте boost:: multi_array и передайте его как ссылку на createBoard() или верните его напрямую (но если вы это сделаете, будут скопированы).

Ответ 8

Вы не должны возвращать указатель на локальные переменные функций, поскольку это пространство будет перезаписано, как только функция вернется.

Хранилище, связанное с платой, находится в стеке функций.