The OpenNET Project / Index page

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

форумы  помощь  поиск  регистрация  майллист  вход/выход  слежка  RSS
"Выделение памяти под двумерный массив"
Вариант для распечатки  
Пред. тема | След. тема 
Форум Программирование под UNIX (C/C++)
Изначальное сообщение [ Отслеживать ]

"Выделение памяти под двумерный массив"  +/
Сообщение от Dronissimo (ok) on 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**)

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

Ответить | Правка | Cообщить модератору

Оглавление

Сообщения по теме [Сортировка по времени | RSS]


1. "Выделение памяти под двумерный массив"  +1 +/
Сообщение от PavelR (??) on 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 *));
> подскажите что и как?

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

Ответить | Правка | ^ к родителю #0 | Наверх | Cообщить модератору

2. "Выделение памяти под двумерный массив"  +/
Сообщение от XAnder (ok) on 15-Июн-11, 08:36 
> не могу понять почему мы вначале выделяем память под строки , а
> потом под столбцы

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

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

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

Ответить | Правка | ^ к родителю #0 | Наверх | Cообщить модератору

3. "Выделение памяти под двумерный массив"  +/
Сообщение от gpl77 (ok) on 15-Июн-11, 13:16 
> Доброго времени суток
> помогите разобраться..запутался-выделение памяти под двумерный массив

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

Ответить | Правка | ^ к родителю #0 | Наверх | Cообщить модератору

4. "Выделение памяти под двумерный массив"  +/
Сообщение от MKuznetsov (??) on 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;
}

Ответить | Правка | ^ к родителю #0 | Наверх | Cообщить модератору

Архив | Удалить

Рекомендовать для помещения в FAQ | Индекс форумов | Темы | Пред. тема | След. тема




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

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