Модуль stdlib.h
Стандартные функции языка C
Модуль stdlib.h предоставляет стандартные функции языка C (компилятор GCC) для работы с динамической памятью, преобразованием строк в числа, генерацией псевдослучайных чисел, математическими операциями, управлением завершением программы и поиском/сортировкой данных.
Для работы с модулем stdlib.h реализованы следующие функции:
// Управление динамической памятью
void *malloc(size_t size);
void *calloc(size_t nmemb, size_t size);
void *realloc(void *ptr, size_t size);
void free(void *ptr);
// Преобразование строк в числа
int atoi(const char *nptr);
long atol(const char *nptr);
long long atoll(const char *nptr);
double atof(const char *nptr);
long strtol(const char *nptr, char **endptr, int base);
long long strtoll(const char *nptr, char **endptr, int base);
unsigned long strtoul(const char *nptr, char **endptr, int base);
unsigned long long strtoull(const char *nptr, char **endptr, int base);
float strtof(const char *nptr, char **endptr);
double strtod(const char *nptr, char **endptr);
long double strtold(const char *nptr, char **endptr);
// Генерация псевдослучайных чисел
int rand(void);
void srand(unsigned int seed);
// Математические операции
int abs(int x);
long labs(long x);
long long llabs(long long x);
div_t div(int numer, int denom);
ldiv_t ldiv(long numer, long denom);
lldiv_t lldiv(long long numer, long long denom);
// Управление завершением программы
void abort(void);
void exit(int status);
int atexit(void (*func)(void));
// Поиск и сортировка
void *bsearch(const void *key, const void *base, size_t nmemb, size_t size, int (*compar)(const void *, const void *));
void qsort(void *base, size_t nmemb, size_t size, int (*compar)(const void *, const void *));
malloc
Функция void *malloc(size_t size) выделяет блок динамической памяти размером size байт.
Параметры:
size— размер выделяемой памяти в байтах.
Возвращаемые значения:
- Указатель на выделенную память или
NULL, если выделение не удалось.
Примечание: Память не инициализируется. При ошибке выделения рекомендуется проверить возвращаемый указатель.
Пример использования:
#include <stdio.h>
#include <stdlib.h>
int main(void) {
int *arr = malloc(5 * sizeof(int));
if (arr == NULL) {
printf("Ошибка выделения памяти\n");
return 1;
}
for (int i = 0; i < 5; i++) {
arr[i] = i;
printf("%d ", arr[i]); // Ожидается: 0 1 2 3 4
}
free(arr);
return 0;
}
calloc
Функция void *calloc(size_t nmemb, size_t size) выделяет память для массива из nmemb элементов размером size байт и инициализирует её нулями.
Параметры:
nmemb— количество элементов.size— размер каждого элемента в байтах.
Возвращаемые значения:
- Указатель на выделенную память или
NULL, если выделение не удалось.
Пример использования:
#include <stdio.h>
#include <stdlib.h>
int main(void) {
int *arr = calloc(5, sizeof(int));
if (arr == NULL) {
printf("Ошибка выделения памяти\n");
return 1;
}
for (int i = 0; i < 5; i++) {
printf("%d ", arr[i]); // Ожидается: 0 0 0 0 0
}
free(arr);
return 0;
}
realloc
Функция void *realloc(void *ptr, size_t size) изменяет размер блока памяти, на который указывает ptr, до size байт.
Параметры:
ptr— указатель на ранее выделенную память илиNULL.size— новый размер в байтах.
Возвращаемые значения:
- Указатель на перераспределенную память или
NULL, если выделение не удалось.
Примечание: Если ptr равен NULL, поведение аналогично malloc. Если size равен 0, память освобождается.
Пример использования:
#include <stdio.h>
#include <stdlib.h>
int main(void) {
int *arr = malloc(3 * sizeof(int));
if (arr == NULL) return 1;
arr[0] = 1; arr[1] = 2; arr[2] = 3;
arr = realloc(arr, 5 * sizeof(int));
if (arr == NULL) {
printf("Ошибка перераспределения памяти\n");
return 1;
}
arr[3] = 4; arr[4] = 5;
for (int i = 0; i < 5; i++) {
printf("%d ", arr[i]); // Ожидается: 1 2 3 4 5
}
free(arr);
return 0;
}
free
Функция void free(void *ptr) освобождает память, ранее выделенную malloc, calloc или realloc.
Параметры:
ptr— указатель на освобождаемую память илиNULL.
Возвращаемые значения:
- Нет.
Примечание: Вызов с ptr, не выделенным указанными функциями, или повторное освобождение вызывает неопределённое поведение.
Пример использования:
#include <stdio.h>
#include <stdlib.h>
int main(void) {
int *arr = malloc(5 * sizeof(int));
if (arr == NULL) return 1;
free(arr);
printf("Память освобождена\n");
return 0;
}
atoi
Функция int atoi(const char *nptr) преобразует строку nptr в целое число типа int.
Параметры:
nptr— указатель на строку.
Возвращаемые значения:
- Целое число или 0, если преобразование невозможно.
Примечание: Не сообщает об ошибках. Рекомендуется использовать strtol для большей надёжности.
Пример использования:
#include <stdio.h>
#include <stdlib.h>
int main(void) {
const char *str = "123";
int num = atoi(str);
printf("Число: %d\n", num); // Ожидается: 123
return 0;
}
atol
Функция long atol(const char *nptr) преобразует строку nptr в целое число типа long.
Параметры:
nptr— указатель на строку.
Возвращаемые значения:
- Целое число или 0, если преобразование невозможно.
Пример использования:
#include <stdio.h>
#include <stdlib.h>
int main(void) {
const char *str = "123456";
long num = atol(str);
printf("Число: %ld\n", num); // Ожидается: 123456
return 0;
}
atoll
Функция long long atoll(const char *nptr) преобразует строку nptr в целое число типа long long.
Параметры:
nptr— указатель на строку.
Возвращаемые значения:
- Целое число или 0, если преобразование невозможно.
Пример использования:
#include <stdio.h>
#include <stdlib.h>
int main(void) {
const char *str = "123456789";
long long num = atoll(str);
printf("Число: %lld\n", num); // Ожидается: 123456789
return 0;
}
atof
Функция double atof(const char *nptr) преобразует строку nptr в число с плавающей точкой типа double.
Параметры:
nptr— указатель на строку.
Возвращаемые значения:
- Число с плавающей точкой или 0.0, если преобразование невозможно.
Пример использования:
#include <stdio.h>
#include <stdlib.h>
int main(void) {
const char *str = "3.14159";
double num = atof(str);
printf("Число: %.5f\n", num); // Ожидается: 3.14159
return 0;
}
strtol
Функция long strtol(const char *nptr, char **endptr, int base) преобразует строку nptr в число типа long с указанием системы счисления base.
Параметры:
nptr— указатель на строку.endptr— указатель на указатель, куда записывается адрес первого непроанализированного символа (илиNULL).base— система счисления (2–36 или 0 для автоопределения).
Возвращаемые значения:
- Преобразованное число или 0 при ошибке (с установкой
errno).
Пример использования:
#include <stdio.h>
#include <stdlib.h>
int main(void) {
const char *str = "123abc";
char *endptr;
long num = strtol(str, &endptr, 10);
printf("Число: %ld, остаток: %s\n", num, endptr); // Ожидается: Число: 123, остаток: abc
return 0;
}
strtoll
Функция long long strtoll(const char *nptr, char **endptr, int base) преобразует строку nptr в число типа long long.
Параметры:
- Аналогично
strtol.
Возвращаемые значения:
- Аналогично
strtol.
Пример использования:
#include <stdio.h>
#include <stdlib.h>
int main(void) {
const char *str = "123456789abc";
char *endptr;
long long num = strtoll(str, &endptr, 10);
printf("Число: %lld, остаток: %s\n", num, endptr); // Ожидается: Число: 123456789, остаток: abc
return 0;
}
strtoul
Функция unsigned long strtoul(const char *nptr, char **endptr, int base) преобразует строку nptr в число типа unsigned long.
Параметры:
- Аналогично
strtol.
Возвращаемые значения:
- Аналогично
strtol.
Пример использования:
#include <stdio.h>
#include <stdlib.h>
int main(void) {
const char *str = "0xFFabc";
char *endptr;
unsigned long num = strtoul(str, &endptr, 16);
printf("Число: %lu, остаток: %s\n", num, endptr); // Ожидается: Число: 255, остаток: abc
return 0;
}
strtoull
Функция unsigned long long strtoull(const char *nptr, char **endptr, int base) преобразует строку nptr в число типа unsigned long long.
Параметры:
- Аналогично
strtol.
Возвращаемые значения:
- Аналогично
strtol.
Пример использования:
#include <stdio.h>
#include <stdlib.h>
int main(void) {
const char *str = "0xFFFFabc";
char *endptr;
unsigned long long num = strtoull(str, &endptr, 16);
printf("Число: %llu, остаток: %s\n", num, endptr); // Ожидается: Число: 65535, остаток: abc
return 0;
}
strtof
Функция float strtof(const char *nptr, char **endptr) преобразует строку nptr в число типа float.
Параметры:
nptr— указатель на строку.endptr— указатель на указатель, куда записывается адрес первого непроанализированного символа (илиNULL).
Возвращаемые значения:
- Преобразованное число или 0.0 при ошибке (с установкой
errno).
Пример использования:
#include <stdio.h>
#include <stdlib.h>
int main(void) {
const char *str = "3.14159abc";
char *endptr;
float num = strtof(str, &endptr);
printf("Число: %.5f, остаток: %s\n", num, endptr); // Ожидается: Число: 3.14159, остаток: abc
return 0;
}
strtod
Функция double strtod(const char *nptr, char **endptr) преобразует строку nptr в число типа double.
Параметры:
- Аналогично
strtof.
Возвращаемые значения:
- Аналогично
strtof.
Пример использования:
#include <stdio.h>
#include <stdlib.h>
int main(void) {
const char *str = "3.14159abc";
char *endptr;
double num = strtod(str, &endptr);
printf("Число: %.5f, остаток: %s\n", num, endptr); // Ожидается: Число: 3.14159, остаток: abc
return 0;
}
strtold
Функция long double strtold(const char *nptr, char **endptr) преобразует строку nptr в число типа long double.
Параметры:
- Аналогично
strtof.
Возвращаемые значения:
- Аналогично
strtof.
Пример использования:
#include <stdio.h>
#include <stdlib.h>
int main(void) {
const char *str = "3.1415926535abc";
char *endptr;
long double num = strtold(str, &endptr);
printf("Число: %.10Lf, остаток: %s\n", num, endptr); // Ожидается: Число: 3.1415926535, остаток: abc
return 0;
}
rand
Функция int rand(void) генерирует псевдослучайное целое число в диапазоне от 0 до RAND_MAX.
Параметры:
- Нет.
Возвращаемые значения:
- Псевдослучайное число.
Примечание: Последовательность зависит от начального значения, установленного srand.
Пример использования:
#include <stdio.h>
#include <stdlib.h>
int main(void) {
srand(42); // Установка начального значения
for (int i = 0; i < 3; i++) {
printf("%d ", rand()); // Ожидается: псевдослучайные числа
}
return 0;
}
srand
Функция void srand(unsigned int seed) устанавливает начальное значение для генератора псевдослучайных чисел.
Параметры:
seed— начальное значение.
Возвращаемые значения:
- Нет.
Пример использования:
#include <stdio.h>
#include <stdlib.h>
int main(void) {
srand(123);
printf("Случайное число: %d\n", rand()); // Ожидается: фиксированное псевдослучайное число
return 0;
}
abs
Функция int abs(int x) возвращает абсолютное значение числа типа int.
Параметры:
x— входное число.
Возвращаемые значения:
- Абсолютное значение
x.
Пример использования:
#include <stdio.h>
#include <stdlib.h>
int main(void) {
int x = -42;
int res = abs(x);
printf("Абсолютное значение: %d\n", res); // Ожидается: 42
return 0;
}
labs
Функция long labs(long x) возвращает абсолютное значение числа типа long.
Параметры:
x— входное число.
Возвращаемые значения:
- Абсолютное значение
x.
Пример использования:
#include <stdio.h>
#include <stdlib.h>
int main(void) {
long x = -123456L;
long res = labs(x);
printf("Абсолютное значение: %ld\n", res); // Ожидается: 123456
return 0;
}
llabs
Функция long long llabs(long long x) возвращает абсолютное значение числа типа long long.
Параметры:
x— входное число.
Возвращаемые значения:
- Абсолютное значение
x.
Пример использования:
#include <stdio.h>
#include <stdlib.h>
int main(void) {
long long x = -123456789LL;
long long res = llabs(x);
printf("Абсолютное значение: %lld\n", res); // Ожидается: 123456789
return 0;
}
div
Функция div_t div(int numer, int denom) выполняет деление numer на denom и возвращает частное и остаток.
Параметры:
numer— числитель.denom— знаменатель.
Возвращаемые значения:
- Структура
div_tс полямиquot(частное) иrem(остаток).
Пример использования:
#include <stdio.h>
#include <stdlib.h>
int main(void) {
div_t result = div(17, 5);
printf("Частное: %d, Остаток: %d\n", result.quot, result.rem); // Ожидается: Частное: 3, Остаток: 2
return 0;
}
ldiv
Функция ldiv_t ldiv(long numer, long denom) выполняет деление numer на denom для чисел типа long.
Параметры:
numer— числитель.denom— знаменатель.
Возвращаемые значения:
- Структура
ldiv_tс полямиquotиrem.
Пример использования:
#include <stdio.h>
#include <stdlib.h>
int main(void) {
ldiv_t result = ldiv(123456L, 100L);
printf("Частное: %ld, Остаток: %ld\n", result.quot, result.rem); // Ожидается: Частное: 1234, Остаток: 56
return 0;
}
lldiv
Функция lldiv_t lldiv(long long numer, long long denom) выполняет деление numer на denom для чисел типа long long.
Параметры:
numer— числитель.denom— знаменатель.
Возвращаемые значения:
- Структура
lldiv_tс полямиquotиrem.
Пример использования:
#include <stdio.h>
#include <stdlib.h>
int main(void) {
lldiv_t result = lldiv(123456789LL, 100LL);
printf("Частное: %lld, Остаток: %lld\n", result.quot, result.rem); // Ожидается: Частное: 1234567, Остаток: 89
return 0;
}
abort
Функция void abort(void) аварийно завершает выполнение программы, вызывая сигнал SIGABRT.
Параметры:
- Нет.
Возвращаемые значения:
- Не возвращается.
Пример использования:
#include <stdio.h>
#include <stdlib.h>
int main(void) {
printf("Программа будет завершена\n");
abort();
printf("Этот код не выполнится\n");
return 0;
}
exit
Функция void exit(int status) завершает выполнение программы с указанным статусом.
Параметры:
status— код завершения (EXIT_SUCCESSилиEXIT_FAILURE).
Возвращаемые значения:
- Не возвращается.
Пример использования:
#include <stdio.h>
#include <stdlib.h>
int main(void) {
printf("Программа завершается с успехом\n");
exit(EXIT_SUCCESS);
printf("Этот код не выполнится\n");
return 0;
}
atexit
Функция int atexit(void (*func)(void)) регистрирует функцию func для вызова при нормальном завершении программы.
Параметры:
func— указатель на функцию без параметров.
Возвращаемые значения:
0— регистрация успешна.- Ненулевое значение — ошибка.
Пример использования:
#include <stdio.h>
#include <stdlib.h>
void cleanup(void) {
printf("Очистка выполнена\n");
}
int main(void) {
atexit(cleanup);
printf("Программа завершается\n");
return 0; // Ожидается: Программа завершается\nОчистка выполнена
}
bsearch
Функция void *bsearch(const void *key, const void *base, size_t nmemb, size_t size, int (*compar)(const void *, const void *)) выполняет бинарный поиск в отсортированном массиве.
Параметры:
key— указатель на искомый элемент.base— указатель на массив.nmemb— количество элементов.size— размер каждого элемента.compar— функция сравнения, возвращающая отрицательное, нуль или положительное значение.
Возвращаемые значения:
- Указатель на найденный элемент или
NULL, если элемент не найден.
Пример использования:
#include <stdio.h>
#include <stdlib.h>
int compare(const void *a, const void *b) {
return (*(int *)a - *(int *)b);
}
int main(void) {
int arr[] = {1, 3, 5, 7, 9};
int key = 5;
int *result = bsearch(&key, arr, 5, sizeof(int), compare);
if (result) {
printf("Найден: %d\n", *result); // Ожидается: Найден: 5
} else {
printf("Не найден\n");
}
return 0;
}
qsort
Функция void qsort(void *base, size_t nmemb, size_t size, int (*compar)(const void *, const void *)) сортирует массив методом быстрой сортировки.
Параметры:
base— указатель на массив.nmemb— количество элементов.size— размер каждого элемента.compar— функция сравнения, возвращающая отрицательное, нуль или положительное значение.
Возвращаемые значения:
- Нет.
Пример использования:
#include <stdio.h>
#include <stdlib.h>
int compare(const void *a, const void *b) {
return (*(int *)a - *(int *)b);
}
int main(void) {
int arr[] = {5, 2, 8, 1, 9};
qsort(arr, 5, sizeof(int), compare);
for (int i = 0; i < 5; i++) {
printf("%d ", arr[i]); // Ожидается: 1 2 5 8 9
}
return 0;
}