#1 21.11.07 00:06
Динамическая память в СИ
что бы выделить память под int А[3] нужно написать int *A=new int[3];
а вот как выделить под int A[3][3]?
перепробовал наверное все варианты.....как сделать через new так и не понял
Offline
#2 21.11.07 00:28
Re: Динамическая память в СИ
Сначала
**A = NULL определяется указатель на указатель с одновременной инициа-лизацией. Затем оператором
A = new double *[m+1]
выделяется память под массив указателей, каждый из которых соответствует массиву-строке. Затем в цикле по i выделяется память под каждую строку.
for (i=0; i<=m; i++)
A[i] = new double *[n+1];
Далее работа с массивом осуществляется, как обычно. После ее завершения необходимо освободить память массива.
Offline
#5 21.11.07 12:28
Re: Динамическая память в СИ
mexx:) написал(а):
Сначала
**A = NULL определяется указатель на указатель с одновременной инициа-лизацией. Затем оператором
A = new double *[m+1]
выделяется память под массив указателей, каждый из которых соответствует массиву-строке. Затем в цикле по i выделяется память под каждую строку.
for (i=0; i<=m; i++)
A[i] = new double *[n+1];
Далее работа с массивом осуществляется, как обычно. После ее завершения необходимо освободить память массива.
так удобно, но естся лишняя память под массив указателей. Когда двумерный массив статический, память в нём всё равно линейная и адрес элемента всегда просто вычисляется по формуле.
Лично я всегда делаю так:
Нужен A[n][m]. Пишу:
int *A;
A = new int[n * m];
дальше когда нужно обратиться к A[i][j], пишу
A[i * m + j];
Так память тоже распределяется линейно, но обращение не такое удобное как в приведённом случае.
И ещё в С нет оператора new, кажется. Ты наверно про С++. Может и ошибаюсь.
И
Jaguar написал(а):
чтобы память очистить от разного мусора
не понимаю, как можно очистить память от мусора, присвоив какому-либо указателю NULL. Так можно лишь засорить память, если указатель до этого указывал на живую память.
Исправлено Kosh_Mar (21.11.07 12:30)
Offline
#9 29.11.07 20:24
Re: Динамическая память в СИ
чет непонятно, парень просит ему выделить массив интов, а все выделяют массив даблов
A = NULL - это какую же память мы очищаем???? чтоб память очистить, вроде как используют оператор delete;
в данном случае случай указывает на утечку памяти.
по моему это только воздух греет...
с маллоками и каллоками не советую париться.... вряд ли ты компилируешь компилятором, который не поддерживает синтаксиса с++, к тому же при использовании маллока и каллока надо библиотеку лишнюю подрубать....
вообщем
int **i;
i = new int*[3];
for (int a = 0; a < 3; a++)
i[a] = new int[3];
i[2][2] = 22; // так и работаешь со всеми элементами
потом очищаешь память в обратном порядке
for (int a = 0; a < 3; a++)
delete[] i[a];
delete i;
Исправлено voropay (29.11.07 20:26)
Offline
#10 29.11.07 20:35
#11 29.11.07 20:48
#12 29.11.07 21:01
Re: Динамическая память в СИ
Kosh_Mar выделяет с помощью new. Так же мог и malloc'ом выделять. Библиотеки бы новой от этого не "подрубилось", как ты говоришь. Использовалась бы все та же RTL, которой пользуются 99% программистов, так что она уже и так "подрублена".
Исправлено Draloskop (29.11.07 21:03)
Offline
#13 29.11.07 23:55
Re: Динамическая память в СИ
voropay, ну если конкретно 3, то конечно нужно как удобнее. Но если это "3" здесь только для примера, а на самом деле там может оказаться реально большое число, то я бы делала, как уже написала.
Offline
#14 07.12.07 21:39
Re: Динамическая память в СИ
// Выделение
int **AllocNMArray(int n, int m)
{
int **a;
a = (int**)malloc(sizeof(int)*n);
for (int i = 0; i < n; i++)
{
a[i] = malloc(sizeof(int)*m);
}
return a;
}
// Освобождение
void FreeNMArray(int n, int ***a)
{
int **t = *a;
*a = NULL;
for (int i = 0; i < n; i++)
{
free(t[i]);
}
free(t);
}
Offline
#15 07.12.07 22:49
#16 11.12.07 17:44
Re: Динамическая память в СИ
Kosh_Mar написала самый оптимальный вариант. Тут дело даже не в выделении лишней памяти под массив указателей. Дело в скорости работы. Когда массив в памяти выделен одним куском - скорость как при работе со статикой. Если-же выделять массив указателей, то фиг знает, как будут расположены столбцы. Скорость обращения к элементам массива заметно снижается.
Offline

