The OpenNET Project / Index page

[ новости /+++ | форум | теги | ]




Версия для распечатки Пред. тема | След. тема
Новые ответы [ Отслеживать ]
Выделение памяти под двумерный массив, !*! 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, 08:35 , 15-Июн-11 (1) +1
    > Доброго времени суток
    > помогите разобраться..запутался-выделение памяти под двумерный массив
    >   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, 08:36 , 15-Июн-11 (2)
    > не могу понять почему мы вначале выделяем память под строки , а
    > потом под столбцы

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

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

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

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

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

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

    /** просто иллюстрация - даже непроверял */
    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;
    }




Партнёры:
PostgresPro
Inferno Solutions
Hosting by Hoster.ru
Хостинг:

Закладки на сайте
Проследить за страницей
Created 1996-2025 by Maxim Chirkov
Добавить, Поддержать, Вебмастеру