Назад |
Для динамического выделения процессу дополнительной памяти, в системе предусмотрены четыре функции.
Форматы вызова перечисленных процедур следующие:
#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); }
Здесь мы намеренно, в демонстрационных целях, применяли разные функции для выделения памяти.