Динамический массив в С: как работать с памятью
Динамический массив в С является массивом, размер которого можно изменять во время выполнения программы. Это достигается с помощью функций, которые являются частью стандартной библиотеки С, таких как malloc() и realloc().
Функция malloc() позволяет выделить блок памяти заданного размера, задаваемого в байтах, и возвращает указатель на начало блока. Если память не может быть выделена, функция возвращает нулевой указатель. Чтобы использовать выделенную память как массив, указатель нужно преобразовать в нужный тип данных, как показано в примере кода ниже:
int *arr;
int n = 10;
arr = (int*) malloc(n * sizeof(int));
В этом примере мы выделяем блок памяти размером 10 элементов типа int, и сохраняем указатель на начало блока в переменной arr. Обратите внимание, что мы используем sizeof(int) для определения размера каждого элемента, и умножаем это на количество элементов, чтобы получить полный размер блока памяти.
Когда нам нужно изменить размер массива, мы можем использовать функцию realloc(). Она принимает два аргумента: указатель на существующий блок памяти и новый размер. Функция возвращает указатель на новый блок памяти, который может быть больше или меньше, чем исходный блок памяти. Если память не может быть выделена, функция возвращает нулевой указатель.
Вот пример кода, который показывает, как использовать realloc() для изменения размера динамического массива:
int *arr;
int n = 10;
arr = (int*) malloc(n * sizeof(int));
// изменяем размер массива на 20 элементов
arr = (int*) realloc(arr, 20 * sizeof(int));
В этом примере мы сначала выделяем блок памяти для 10 элементов типа int с помощью malloc(). Затем мы используем realloc() для изменения размера массива на 20 элементов. Обратите внимание, что мы передаем указатель на существующий блок памяти (arr) и новый размер (20 * sizeof(int)) в realloc().
Работа с динамическими массивами в С требует от программиста аккуратности. Нужно помнить, что выделенная память не освобождается автоматически, и ее следует освободить явным вызовом функции free(). Неправильное использование динамических массивов может вызывать ошибки в памяти, которые могут привести к сбоям и повреждению данных.