URL: https://www.opennet.me/cgi-bin/openforum/vsluhboard.cgi
Форум: vsluhforumID9
Нить номер: 9162
[ Назад ]

Исходное сообщение
"Выделение памяти под двумерный массив"

Отправлено Dronissimo , 14-Июн-11 23:26 
Доброго времени суток
помогите разобраться..запутался-выделение памяти под двумерный массив
              
  int **array1 = (int **)malloc(nrows * sizeof(int *));
        for(i = 0; i < nrows; i++)
        array1[i] = (int *)malloc(ncolumns * sizeof(int));

не могу понять почему мы вначале выделяем память под строки , а потом под столбцы
т.е

\\пускай будет char для наглядности
              
  char **array1 = (char **)malloc(5 * sizeof(char*));
        for(i = 0; i < 5; i++)
        array1[i] = (char *)malloc(3 * sizeof(char));

получается , что создается
_ _ _ _ _
|1|2|3|4|5| -rows
_   _
|_| |_|
|_| |_|
|_| |_|
_   _
|_| |_|
|_| |_|
|_| |_|
_  
|_|  
|_|
|_|

как то так =)
имею в виду что я думал
\\ вначале создается столбец длинной ncolumns
for (i=0;i<ncolumns;i++)
    *(array+i)

\\и каждый указатель в array[i] указывает на выделенную память длинной nrows*sizeof(int**)

подскажите что и как?


Содержание

Сообщения в этом обсуждении
"Выделение памяти под двумерный массив"
Отправлено PavelR , 15-Июн-11 08:35 
> Доброго времени суток
> помогите разобраться..запутался-выделение памяти под двумерный массив
>   int **array1 = (int **)malloc(nrows * sizeof(int *));
>         for(i = 0; i  < nrows; i++)
>         array1[i] = (int *)malloc(ncolumns * sizeof(int));
> не могу понять почему мы вначале выделяем память под строки , а
> потом под столбцы

Ну можете считать первый индекс столбцом, а второй строками, код от этого не изменится


> т.е
> \\пускай будет char для наглядности
>   char **array1 = (char **)malloc(5 * sizeof(char*));
>         for(i = 0; i < 5; i++)
>         array1[i] = (char *)malloc(3 * sizeof(char));
> получается , что создается

ну как-то так =)  

> как то так =)
> имею в виду что я думал
> \\ вначале создается столбец длинной ncolumns
> for (i=0;i<ncolumns;i++)
>     *(array+i)

ой, какой-то бред.
Что значит - создается ? Ничего не создается - _выделяется память_.


> \\и каждый указатель в array[i] указывает на выделенную память длинной nrows*sizeof(int**)

Чтобы значение в array[i] было _указателем_ и _указывало на выделенную память_ - её надо выделить, и занести значение адреса в array[i], что и делается в цикле

>         for(i = 0; i  < nrows; i++)
>         array1[i] = (int *)malloc(ncolumns * sizeof(int));

Ну а сначала надо выделить память под array, что делается в

>   int **array1 = (int **)malloc(nrows * sizeof(int *));
> подскажите что и как?

Вот как-то так.


"Выделение памяти под двумерный массив"
Отправлено XAnder , 15-Июн-11 08:36 
> не могу понять почему мы вначале выделяем память под строки , а
> потом под столбцы

Нужно выяснить, кто такие "мы", и спросить у них, зачем они так делают ;-) На самом деле здесь нет никакой разницы, что сначала - строки или столбцы. А, учитывая что все строки имеют одинаковую длину, и столбцы - тоже, можно вообще обойтись простым массивом и не городить циклы с malloc'ами.

> получается , что создается ...

Приведённая схема, дальнейшие рассуждения и вопрос непонятны, постарайтесь сформулировать чётче.


"Выделение памяти под двумерный массив"
Отправлено gpl77 , 15-Июн-11 13:16 
> Доброго времени суток
> помогите разобраться..запутался-выделение памяти под двумерный массив

http://c-faq.com/aryptr/dynmuldimary.html


"Выделение памяти под двумерный массив"
Отправлено MKuznetsov , 23-Июн-11 21:16 
можно вообще взять большой кус памяти и самому разметить как хочется

/** просто иллюстрация - даже непроверял */
void **malloc2d(int xdim,int ydim,size_t itemsize) {
    int x,y;
    void *p;
    void **row;
    size_t size=sizeof(void *)*ydim+(xdim*ydim*itemsize);
    row=(void **)p=malloc(size);
    for(y=0;y<ydim;y++)
        row[y]=(void *)(((char *)(row+ydim))+y*xdim*itemsize);
    return (void **)p;
}