#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
не требуются, это просто моя привычка.