Назад

Содержание

Вперед


1.8. Распределение памяти.

    Для динамического выделения процессу дополнительной памяти, в системе предусмотрены четыре функции.

Форматы вызова перечисленных процедур следующие:

#include <sys/types.h>
#include <stdlib.h>

void *malloc (size_t size);
void *calloc (size_t nobj, size_t size);
void *realloc (void *ptr, size_t newsize);
void free (void *ptr);

    Здесь:

size - в случае malloc( ) - размер выделяемой области памяти в байтах; в случае calloc( ) - размер в байтах элемента массива данных, под который выделяется память;
nobj - число элементов массива данных;
ptr - указатель на ранее выделенную память;
newsize - новый размер области памяти.

    Функции malloc( ), calloc( ) и realloc( ) возвращают указатель на выделенную память или NULL, если свободного сегмента указанного размера найти не удалось. Адрес памяти, возвращаемый процедурами, гарантировано выравнивается на границу максимального по размеру типа данных в системе. Обычно это тип double, размер которого равен восьми байтам.

    В приводимом примере мы заказываем память под матрицу чисел и заполняем ее единицами.

#include <stdlib.h>

void FillMatrix (int **matrix, int nrows, int ncols)
{
  int i, j;

  for (i=0; i <nrows; i++)
    for (j=0; j<nrows; j++)
      matrix [i] [j] = 1;
}

void main( )
{
  int **matrix;

  if ((matrix=(int**)malloc(100*sizeof(int*)) == NULL) {
    puts ("no memory\n");
  exit (1);
  }

  for (i=0; i<100; i++)
    if ( (matrix [i] = (int*)calloc(100, sizeof(int)) == NULL) {
      puts ("no memory\n");
      exit (1);
    }
  }

  FillMatrix (matrix, 100, 100);

  for (i=0; i<100; i++)
    free (void*)matrix[i]);

  free ( (void*)matrix);

  exit (0);
}

    Здесь мы намеренно, в демонстрационных целях, применяли разные функции для выделения памяти.