Кто-нибудь может объяснить мне, как вернуть двухмерный массив в C из функции?

#c #arrays #function

#c #массивы #функция

Вопрос:

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

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

1. Стандарт C запрещает использовать типы массивов в качестве возвращаемого типа для функции.

Ответ №1:

Это зависит от того, как это реализовано. Вы можете либо работать только с одномерным массивом, где вам известна длина каждого (строки), а следующая строка начинается сразу после предыдущей. ИЛИ у вас может быть массив указателей на массивы. Дополнительная стоимость заключается в том, что вам нужно отменить ссылку на два указателя, чтобы получить доступ к одному элементу данных.

 // 2D array of data, with just one array
char* get_2d_ex1(int rows, int cols) {
    int r, c, idx;
    char* p = malloc(rows*cols);

    for (r=0; r<rows; r  ) {
        for (c=0; c<cols; c  ) {
            idx = r*cols   c;   // this is key
            p[idx] = c;         // put the col# in its place, for example.
        }
     }
     return p;
}
  

Ответ №2:

Объявите свою функцию как возвращающую указатель на указатель. Если мы используем int в качестве примера:

 int **samplefunction() {
    int** retval = new int*[100];
    for (int i = 1; i < 100; i  ) {
        retval[i] = new int[100];
    }
    // do stuff here to retval[i][j]
    return retval;
}
  

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

1. Я признаю себя виновным в этом 😉

2. Кроме того … разве это не было бы задачей для кого-то, чтобы очистить, если они не знали, сколько элементов в каждом массиве?

3. Для кого-то также было бы непросто / использовать /, если бы они не знали, сколько элементов в каждом массиве. Точно так же… массивы…

Ответ №3:

Вот пример того, как вы могли бы создавать, манипулировать и освобождать «2d массив»:

 #include <stdlib.h>

#define ROWS   5
#define COLS   10

int **create_2d_array(size_t rows, size_t cols)
{
   size_t i;   
   int **array = (int**)malloc(rows * sizeof(int*));
   for (i = 0; i < rows; i  )
      array[i] = (int*)malloc(cols * sizeof(int));

   return array;
}

void free_2d_array(int **array, size_t rows, size_t cols)
{
   size_t i;
   for (i = 0; i < rows; i  )
      free(array[i]);

   free(array);
}

int main(void)
{
   int **array2d = create_2d_array(ROWS, COLS);
   /* ... */
   array2d[3][4] = 5;
   /* ... */
   free_2d_array(array2d, ROWS, COLS);

   return 0;
}
  

Чтобы создать «2d массив» / матрицу, все, что вам нужно сделать, это создать динамический массив указателей (в данном случае int* ) размера строк / ширины:

 int **array = (int**)malloc(rows * sizeof(int*));
  

Затем вы устанавливаете каждый из этих указателей так, чтобы он указывал на динамический массив int размера столбцов / высоты:

 array[i] = (int*)malloc(cols * sizeof(int));
  

Обратите внимание, что приведения к malloc не требуются, это просто моя привычка.