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


Функция malloc( )

Пусть нам нужно распределить память для запоминания используемых данных. Некоторые ячейки памяти распределяются автоматически, Например, мы можем объявить

char str[ ] = "Символьная строка";

Будет выделена память, достаточная для запоминания этой строки. Мы можем запросить определенный объем памяти:

int mas[150];

Это описание выделяет 150 ячеек памяти, каждая из которых предназначена для запоминания целого значения. Но язык Си позволяет нам распределять дополнительную память во время работы программы. Предположим, мы пишем программу и не знаем, сколько данных нам придется вводить. Тогда можно выделить нужный нам, по нашему предположению, объем памяти, а затем, если понадобится, потребовать еще. Чтобы сделать это, нужно использовать функцию malloc( ). И без указателей тут не обойтись!

/* добавляем память, если необходимо */

#include <stdio.h>

#include <stdlib.h>

#include <string.h>

#define STOP "\n" /* сигнал прекращения ввода */

#define BLOCK 100 /*байты памяти */

#define LIM 40 /*предельная длина вводимой строки*/

#define MAX 50 /*максимальное число вводимых строк */

#define TIME 20000 /* большая задержка времени */

main ( )

{

char store[BLOCK]; /* исходный блок памяти*/

char symph[LIM]; /* приемник вводимых строк*/

char *end; /* указывает на конец памяти */

char *starts[MAX]; /* указывает на начала строк*/

int index = 0; /*количество вводимых строк */

int count; /* счетчик*/

сhar malloc( ); / * распределитель памяти */

starts[0]=store;

end=starts[0]+BLOCK-1;

puts("Вводите строки по одной");

puts("для завершения ввода в начале строке нажимите клавишу [ввод]");

puts("Начинайте!.");

while(index<MAX) {

if(fgets(symph,LIM,stdin))

if (strcmp(fgets(symph,LIM,stdin),STOP) == 0)

break;

if(strlen(symph)>end - starts[index]) {

/* действия при недостатке памяти для

запоминания вводимых данных*/

puts("подождите, программа попробует найти

дополнительную память");

starts[index]=malloc(BLOCK);

end=starts[index]+BLOCK- 1;

for(count=0; count<TIME; count++);

puts("память найдена");

}

strcpy(starts[index],symph);

starts[index+1]=starts[index] + strlen(symph)+1;

if(++index<MAX)

printf("Строка: %d. продолжайте.\n", index);

}

puts("Вывод программы");

for(count=0; count<index; count++)

puts(starts[count]);

}

Давайте посмотрим, что делает функция malloc( ). Она берет аргумент в виде целого без знака, которое представляет количество требуемых байтов памяти. Так, malloc(BLOCK) требует 100 байт. Функция возвращает указатель на тип char в начало нового блока памяти. Мы использовали описание

char *malloc( );

чтобы предупредить компилятор, что malloc( ) возвращает указатель на тип char. Поэтому мы присвоили значение этого указателя элементу массива starts[index] при помощи оператора

starts[index]=malloc(BLOCK);

Предположим, что мы хотим работать с памятью типа int, а не char. Mожете и здесь использовать malloc( ). Вот как это делается:

char malloc( );

/* по-прежнему описываем как указатель на char */

int *newmem; newmem = (int *)malloc(100);

/* используем операцию приведения типа */

Снова требуется 100 байт. Операция приведения типа преобразует значение, возвращенное указателем на тип char, в указатель на тип int. Если в системе int. занимает два байта памяти, это значит, что 100 байт можно использовать для запоминания 50 целых чисел.

Функция calloc( )

Другую возможность распределения памяти дает нам применение функции calloc( ).

char *calloc( ); long *newmem;

newmem=(long *) calloc(100,sizeof(long));

Функция calloc( ) возвращает указатель на char. Нужно использовать оператор приведения типа, если вы хотите запомнить другой тип. calloc( ) имеет два аргумента, и оба они должны быть целыми без знака. Первый аргумент содержит количество требуемых ячеек памяти. Второй аргумент - размер каждой ячейки в байтах. Функция calloc( ) обнуляет содержимое всего блока. Ваша библиотека языка Си возможно представляет несколько других функций управления памятью, вы можете исследовать их самостоятельно!

 

 

16. Лекция: Функции в примерах.

 

-Функция получения случайных чисел.

-Поиск узлов из простых чисел.

-Матрица инцидентности.

-Структуры данных. Работа с файлами.

-Все операции со стеком.

-Примеры из графики, все преобразования трехмерного пространства.