Как создать 2D-массив с помощью функции?

#c #function #return

#c #функция #Возврат

Вопрос:

Я пытаюсь определить 2D-массив, но я хочу сделать это в функции,

вот мой код:

 int** createArray( int columns, int rows)
{   
    int** array[rows];
    for(int i = 0; i < rows; i  )
    {
        array[i] = new int*[columns];
    }

    for(int i = 0; i <columns; i  )
    {
        for(int j = 0; j < rows; j  )
        {
            array[i][j] = 0;
            std::cout <<array[i][j];
        }
        std::cout<<"n";
    }
    return *array;
}

int main()
{
    
int **myArray = createArray(3,5);


for(int k =0; k < 5; k  )
{
    if( (myArray[0][k] == 0) amp;amp; (amp;myArray[1][k] == 0)) //segmentation fault
    {
        myArray[2][k] = 10; //segmentation fault
    }

delete[] myArray;
}
  

Но это вызывает ошибки, которые можно рассматривать как комментарии в строках. Я новичок в C и не знаю, как это исправить.

Большое вам спасибо

Комментарии:

1. Ошибка понятна сама по себе. Вы упомянули int в качестве возвращаемого типа createArray функции (посмотрите, как писать сигнатуры функций). Измените его на тип переменной array

2. Спасибо, но, как я уже сказал, я новичок в C , поэтому для меня ошибка не говорит сама за себя, как я могу ее исправить? Я попытался изменить тип функции на void, но теперь я не могу присвоить созданному массиву имя

3. Что говорит @Cherubim, так это изменить возвращаемый тип createArray to int** . Вы всегда должны возвращать то, что обещаете вернуть!

4. @Botje За исключением того, что array in createArray не int** является ни конвертируемым в это.

5. @Mechatrnk Не связывайтесь с new самим delete собой, пожалуйста. Это не предусмотрено в c , но для чего предназначены стандартные контейнерные классы (т. Е. std::vector<T> std::array<T,Size> ).

Ответ №1:

Предпочтительнее std::vector ручное управление памятью:

 std::vector<std::vector<int>> createArray(int columns, int rows)
{   
    return std::vector<std::vector<int>(rows, std::vector<int>(columns));
}

int main()
{
    int COLUMNS = 5;
    int ROWS = 3;
    auto myArray= createArray(COLUMNS, ROWS); 

    /*
    Do stuff
    */

    //std::vector handles delete on it's own, no need to clean up
}
  

Если вы не можете использовать std::vector по какой-либо причине, это способ инициализации 2D-массива в куче:

 int** createArray(int columns, int rows)
{   
    int** arr = new int*[rows];
    for(int i = 0; i < rows;   i) 
    {
        arr[i] = new int[columns];
    }

    return arr;
}

int main()
{
    int COLUMNS = 5;
    int ROWS = 3;
    int** myArray= createArray(COLUMNS, ROWS); 

    /*
    Do stuff
    */

    //you need to a delete for every new and delete[] for every new[]
    for(int i = 0; i < rows;   i)    
    {
        delete[] myArray[i];
    }
    delete[] myArray;
}