Доброго времени суток
помогите разобраться..запутался-выделение памяти под двумерный массив
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**)
подскажите что и как?
> Доброго времени суток
> помогите разобраться..запутался-выделение памяти под двумерный массив
> 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 *));
> подскажите что и как?Вот как-то так.
> не могу понять почему мы вначале выделяем память под строки , а
> потом под столбцыНужно выяснить, кто такие "мы", и спросить у них, зачем они так делают ;-) На самом деле здесь нет никакой разницы, что сначала - строки или столбцы. А, учитывая что все строки имеют одинаковую длину, и столбцы - тоже, можно вообще обойтись простым массивом и не городить циклы с malloc'ами.
> получается , что создается ...
Приведённая схема, дальнейшие рассуждения и вопрос непонятны, постарайтесь сформулировать чётче.
> Доброго времени суток
> помогите разобраться..запутался-выделение памяти под двумерный массив
можно вообще взять большой кус памяти и самому разметить как хочется/** просто иллюстрация - даже непроверял */
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;
}