Динамическое размещение 2D-массива внутри функции (использование указателей для возврата адреса выделенного объекта) - PullRequest
0 голосов
/ 02 сентября 2011

Я хотел бы знать, как передавать указатели на динамически размещенные массивы с помощью аргументов функции. Предполагается, что эта функция выделяет массив 10х10 (для простоты проверки пропущены). Это возможно? Что я делаю неправильно? Заранее спасибо.

int array_allocate2DArray ( int **array, unsigned int size_x, unsigned int size_y)
{
    array = malloc (size_x * sizeof(int *));

    for (int i = 0; i < size_x; i++)
        array[i] = malloc(size_y * sizeof(int));

    return 0;
}

int main()
{
    int **array;
    array_allocate2DArray (*&array, 10, 10);
}

Ответы [ 2 ]

1 голос
/ 06 декабря 2012

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

int **array_allocate2DArray(unsigned int size_x, unsigned int size_y)
{
        int i;
        int **arr;

        arr = malloc(size_x*(sizeof(int*)));

        for (i=0 ; i<size_x ; i++){
                arr[i] = malloc(size_y);
                *arr[i] = 99;
        }

        return arr;

}

int main(void)
{
        int i;
        int **arr;

        arr = array_allocate2DArray(10, 10);

        for (i=0 ; i<10 ; i++){
                printf("%d\n", *arr[i]);
                free(arr[i]);
        }
        free(arr);

        return 0;
}
0 голосов
/ 02 сентября 2011

Попробуйте что-то вроде этого:

int array_allocate2DArray (int ***p, unsigned int size_x, unsigned int size_y)
{
    int **array = malloc (size_x * sizeof (int *));

    for (int i = 0; i < size_x; i++)
        array[i] = malloc(size_y * sizeof(int));

    *p = array;
    return 0;
}


int **array;
array_allocate2DArray (&array, 10, 10);

Я использовал временный p, чтобы избежать путаницы.

...