Распределение памяти
Функция 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. Лекция: Функции в примерах.
-Функция получения случайных чисел.
-Поиск узлов из простых чисел.
-Матрица инцидентности.
-Структуры данных. Работа с файлами.
-Все операции со стеком.
-Примеры из графики, все преобразования трехмерного пространства.