Модуль 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;
}