Вернуть 2-мерный массив в функции C - PullRequest
1 голос
/ 20 февраля 2012

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

Ответы [ 4 ]

4 голосов
/ 20 февраля 2012

Вы можете не просто вернуть malloc( x * y * sizeof(type) );

Это приведет к ошибке сегментации, когда вы попытаетесь проиндексировать массив как двумерный массив.

int **a = malloc(10 * 10 * sizeof(int));

a[1][0] = 123;
a[0][1] = 321;

Результат вышеописанного: Segmentation fault

Сначала необходимо создать массив указателей с помощью c/malloc(), затем выполнить итерацию этого массива указателей и выделить место для ширины для каждого из них.

void *calloc2d(size_t x, size_t y, size_t elem_size) {
    void **p = calloc(y, sizeof(void*));
    if(!p) return NULL;

    for(int i = 0; i < y; i++) {
        p[i] = calloc(x, elem_size);
        if(!p[i]) {
            free2d(y, p);
            return NULL;
        }
    }

    return (void*)p;
}

и бесплатно

void free2d(size_t y, void *matrix) {
    if(!matrix) return;

    void **m = matrix;
    for(int i = 0; i < y; i++) {
        if(m[i]) free(m[i]);
    }
    free(m);

    return;
}
4 голосов
/ 20 февраля 2012

Функция, которая возвращает динамически размещаемый двумерный массив для типа int.

int ** myfunc(size_t width, size_t height) 
{
    return malloc(width * height * sizeof(int));
}

Его необходимо удалить с помощью free, если он больше не используется.

EDIT Это только выделяет пробел для массива, к которому может обращаться арифметика указателя, но, к сожалению, не с помощью операторов индекса, таких как array[x][y].

что-то вроде здесь - хорошее объяснение.Это сводится к следующему:

int ** myfunc(size_t ncolumns, size_t nrows)
{
    int **array;
    array = malloc(nrows * sizeof(int *));
    for(i = 0; i < nrows; i++)
    {
        array[i] = malloc(ncolumns * sizeof(int));
    }
}
1 голос
/ 20 февраля 2012

Если вы знаете размер массива, вы можете сделать это:

int (*myfunc())[10] {
 int (*ret)[10]=malloc(10*10*sizeof(int));
 return ret;
}

Эта функция возвращает указатель на 10 массивов по 10 дюймов.

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

1 голос
/ 20 февраля 2012

Это должно быть просто, я думаю ...

char **functioName(char param[][20])
{
  char[][20] temp = malloc(20 * 20 * sizeof char);


 //processing  
  return temp

}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...