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