Вернуть динамически размещенный массив?(С) - PullRequest
0 голосов
/ 29 января 2019

Рассмотрим заданное выделение 2d массива:

int (*some)[10] = malloc(sizeof(int[10][10]));

Это выделяет массив 10 x 10 2.Видимо, его тип int (*)[10].Я хочу написать функцию initialize(), которая будет ее выделять, инициализировать и затем возвращать указатель на массив, чтобы конструкция some[i][j] могла использоваться в других функциях, которые могут передавать указатель на массив, который она пересекает.,

Каким должен быть прототип, в частности тип возвращаемого значения initialize()?

Ответы [ 3 ]

0 голосов
/ 29 января 2019

выделяет таблицу из nrow указателей на (выделенный) массив int из size элементов

void *allocate_rows(int *(*ptr)[size], size_t nrows)
{
    int (*tmpptr)[size] = *ptr;

    *ptr = malloc(nrows * sizeof(*ptr));

    if(*ptr)
    {
        while(nrows--)
        {
            tmpptr = malloc(sizeof(*tmpptr));
            if(!tmpptr)
            {
                /* malloc failed do something */
            }
            else 
            {
                tmpptr++;
            }
        }
    return *ptr;
}
0 голосов
/ 29 января 2019

In int (*some)[10] = malloc(sizeof *some);, some - это "указатель на массив из 10 int`.

Если вы хотите, чтобы other была функцией, возвращающей указатель на массив из 10 int,вы можете начать с int (*some)[10]; и заменить some на то, как будет выглядеть вызов такой функции для получения вашего объявления.

int (*some)[10]; => int (*other(argument1,argument2))[10];

Вот какон работал в предварительно стандартизированном C. Поскольку стандартизированный C имеет прототипы, вы также заменили бы список идентификаторов аргументов списком типов параметров, например:

int (*other(int argument1, double argument2))[10];

Программа cdecl или веб-сайт cdeclможет помочь вам проверить результат :

$ echo 'explain   int (*other(int,double))[10]'|cdecl
  declare other as function (int, double) returning pointer to array 10 of int

Большинство людей считают typedef более читабельным:

typedef int (*pointer_to_an_array_of_10_int)[10];
pointer_to_an_array_of_10_int other(int, double);

//to verify it's a compatible declaration 
int (*other(int , double ))[10]; 
0 голосов
/ 29 января 2019
int (*initialize(void))[10] { ... }

initialize - это функция, которая не принимает параметров и возвращает указатель на массив 10 int.

. Для этого следует использовать typedef.

...