Официальный сайт студ.городка НГТУ
Программирование и БД » Динамическая память в СИ 

#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

#3  21.11.07 10:52

Re: Динамическая память в СИ

**A = NULL  а это зачем? Если ты потом все равно выделяешь под него какую-то область памяти.

Offline

#4  21.11.07 11:57

Re: Динамическая память в СИ

видимо, чтобы память очистить от разного мусора

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

#6  21.11.07 13:24

Re: Динамическая память в СИ

Kosh_Mar написал(а):

И ещё в С нет оператора new, кажется. Ты наверно про С++. Может и ошибаюсь.

Не ошибаешься. В С - malloc() и calloc().

Offline

#7  21.11.07 20:26

Re: Динамическая память в СИ

int i;
double **A;
A = new double*[3];
for(i=0; i<3; i++)
   A[i] = new double[3];


все просто.

Offline

#8  21.11.07 21:16

Re: Динамическая память в СИ

mexx:) написал(а):

Сначала
**A = NULL     определяется указатель на указатель с одновременной инициа-лизацией.

так делать нельзя, максимум что можно: A=NULL

по теме: можно воспользоваться способами, которые предложили Kosh_Mar, samael

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

Re: Динамическая память в СИ

Библиотеку лишнюю подрубать... А new, наверное, святой дух выполняет. В любом случае будет нужна RTL C или С++.
По теме: делай так, как советует Kosh_Mar.

Offline

#11  29.11.07 20:48

Re: Динамическая память в СИ

ага, а Kosh_Mar тогда чем память выделяет ???
много же в памяти будут занимать три указателя на инт...
больше ватокатства

Исправлено voropay (29.11.07 20:51)

Offline

#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

Re: Динамическая память в СИ

а про очистку памяти путем присваивания null - не путайте C/C++ с C#'ом )

Offline

#16  11.12.07 17:44

Re: Динамическая память в СИ

Kosh_Mar написала самый оптимальный вариант. Тут дело даже не в выделении лишней памяти под массив указателей. Дело в скорости работы. Когда массив в памяти выделен одним куском - скорость как при работе со статикой. Если-же выделять массив указателей, то фиг знает, как будут расположены столбцы. Скорость обращения к элементам массива заметно снижается.

Offline

Программирование и БД » Динамическая память в СИ 

ФутЕр:)

© Hostel Web Group, 2002-2025.   Сообщить об ошибке

Сгенерировано за 0.420 сек.
Выполнено 14 запросов.