возвращает указатель на область, достаточную для хранения массива из n
объектов указанного размера (size), или NULL, если запрос не удается удовлетворить. Выделенная память обнуляется.Указатель, возвращаемый функциями malloc
и calloc, будет выдан с учетом выравнивания, выполненного согласно указанному типу объекта. Тем не менее к нему должна быть применена операция приведения к соответствующему типу (Как уже отмечалось (см. примеч. в параграфе 6.5), замечания о приведении типов значений, возвращаемых функциями malloc или calloc, - неверно. - Примеч. авт.), как это сделано в следующем фрагменте программы:int *ip;
ip = (int *) calloc(n, sizeof(int));
Функция free(p)
освобождает область памяти, на которую указывает p, - указатель, первоначально полученный с помощью malloc или calloc. Никаких ограничений на порядок, в котором будет освобождаться память, нет, но считается ужасной ошибкой освобождение тех областей, которые не были получены с помощью calloc или malloc.Нельзя также использовать те области памяти, которые уже освобождены. Следующий пример демонстрирует типичную ошибку в цикле, освобождающем элементы списка.
for (p = head; p != NULL; p = p-›next) /* НЕВЕРНО */
free(p);
Правильным будет, если вы до освобождения сохраните то, что вам потребуется, как в следующем цикле:
for (p = head; p != NULL; p = q) {
q = p-›next;
free(p);
}
В параграфе 8.7 мы рассмотрим реализацию программы управления памятью вроде malloc
, позволяющую освобождать выделенные блоки памяти в любой последовательности.7.8.6 Математические функции
В ‹math.h›
описано более двадцати математических функций. Здесь же приведены наиболее употребительные. Каждая из них имеет один или два аргумента типа double и возвращает результат также типа double.sin(x)
- синус x, x в радианах cos(x)
- косинус x, x в радианах atan2(y,x)
- арктангенс y/x, y и x в радианах exp(x)
- экспоненциальная функция e в степени x log(x)
- натуральный (по основанию e) логарифм x (x›0) log10(x)
- обычный (по основанию 10) логарифм x (x›0) pow(x,y)
- x в степени y sqrt(x)
- корень квадратный x (x › 0) fabs(x)
- абсолютное значение x 7.8.7 Генератор случайных чисел
Функция rand
вычисляет последовательность псевдослучайных целых в диапазоне от нуля до значения, заданного именованной константой RAND_MAX, которая определена в ‹stdlib.h›. Привести случайные числа к значениям с плавающей точкой, большим или равным 0 и меньшим 1, можно по формуле#define frand ((double) rand / (RAND_MAX+1.0))
(Если в вашей библиотеке уже есть функция для получения случайных чисел с плавающей точкой, вполне возможно, что ее статистические характеристики лучше указанной.)
Функция srand
(unsigned) устанавливает семя для rand. Реализации rand и srand, предлагаемые стандартом и, следовательно, переносимые на различные машины, рассмотрены в параграфе 2.7.Упражнение 7.9
. Реализуя функции вроде isupper, можно экономить либо память, либо время. Напишите оба варианта функции.Глава 8. Интерфейс с системой UNIX
Свои услуги операционная система UNIX предлагает в виде набора системных вызовов
, которые фактически являются ее внутренними функциями и к которым можно обращаться из программ пользователя. В настоящей главе описано, как в Си-программах можно применять некоторые наиболее важные вызовы. Если вы работаете в системе UNIX, то эти сведения будут вам полезны непосредственно и позволят повысить эффективность работы или получить доступ к тем возможностям, которых нет в библиотеке. Даже если вы используете Си в другой операционной системе, изучение рассмотренных здесь примеров все равно приблизит вас к пониманию программирования на Си; аналогичные программы (отличающиеся лишь деталями) вы встретите практически в любой операционной системе. Так как библиотека Си-программ, утвержденная в качестве стандарта ANSI, в основном отражает возможности системы UNIX, предлагаемые программы помогут вам лучше понять и библиотеку.Глава состоит из трех основных частей, описывающих: ввод-вывод
, файловую систему и организацию управления памятью. В первых двух частях предполагается некоторое знакомство читателя с внешними характеристиками системы UNIX. В главе 7 мы рассматривали единый для всех операционных систем интерфейс ввода-вывода. В любой конкретной системе программы стандартной библиотеки пишутся с использованием средств именно этой конкретной системы. В следующих нескольких параграфах мы опишем вызовы системы UNIX по вводу-выводу и покажем, как с их помощью можно реализовать некоторые разделы стандартной библиотеки.