Для программ на C
Данная статья основана на материале статьи "Dynamic Array in C".
Динамические массивы - очень полезные структуры данных. Они могут быть инициализированы с переменным размером во время выполнения. Этот размер может быть изменен позже в программе, чтобы расширить (или) уменьшить массив. В отличие от массивов фиксированного размера и массивов переменной длины, массивы с динамическим размером размещаются в куче.
В этой статье рассматриваются:
- построение динамических массивов;
- использование низкоуровневых функций, таких как
malloc,free,reallocдля реализации массивов динамического размера.
Функция malloc
Мы можем использовать несколько функций C, таких как malloc, free, calloc, realloc, reallocarray, для реализации массивов динамического размера.
Вызов функции malloc эквивалентен запросу операционной системы выделить n байт. Если выделение памяти прошло успешно, malloc возвращает указатель на блок памяти. В противном случае он возвращает NULL. malloc ссылается на "выделение памяти".
Сигнатура функции:
void *malloc(size_t size);
Пример использования malloc:
#include <stdio.h>
#include <stdlib.h>
int main() {
int n = 10;
int * p = malloc(n);
if (p == NULL) {
printf("Unable to allocate memory :(\n");
return -1;
}
printf("Allocated %d bytes of memory\n", n);
return 0;
}
В приведенном выше фрагменте мы используем malloc для создания n байт памяти и назначения ее указателю p. Компиляция его с приведенными ниже флагами немедленно выдает ошибку. Очевидно, что было сделано что-то не так. Мы не освобождали память.
❯ gcc -fsanitize=leak malloc-snippet.c && ./a.out
Allocated 10 bytes of memory
=================================================================
==46405==ERROR: LeakSanitizer: detected memory leaks
Direct leak of 10 byte(s) in 1 object(s) allocated from:
#0 0x7f011904a5d1 in __interceptor_malloc ../../../../src/libsanitizer/lsan/lsan_interceptors.cpp:56
#1 0x56087c6bf1a8 in main (/home/appaji/dynamic-size-arrays-in-c/a.out+0x11a8)
#2 0x7f0118e76564 in __libc_start_main (/lib/x86_64-linux-gnu/libc.so.6+0x28564)
SUMMARY: LeakSanitizer: 10 byte(s) leaked in 1 allocation(s).