Использование realloc() в C: синтаксис, лучшие практики и пример
Что такое realloc()
realloc() — функция стандартной библиотеки C, изменяющая размер уже выделенного блока памяти. Она расширяет или сужает блок, сохраняя его содержимое. Это делает управление динамической памятью более эффективным, когда требуемый размер меняется во время выполнения.
Синтаксис
ptr = realloc(ptr, newSize);
ptr указывает на ранее выделенный блок, newSize — новый размер в байтах. После вызова ptr указывает на начало нового блока. Функция копирует данные в новое место и освобождает старый блок при успехе.
Важные моменты
- При успехе возвращённый указатель может совпадать со старым или быть новым.
- При неудаче возвращает
NULLи оставляет исходный блок нетронутым. - Всегда присваивайте результат временному указателю, чтобы не потерять исходный адрес при ошибке.
- После успешного перераспределения освобождайте указатель ровно один раз.
Пример — изменение размера строкового буфера
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main(void) {
char *buf = malloc(10);
if (!buf) { perror("malloc"); return EXIT_FAILURE; }
strcpy(buf, "Programming");
printf("%s\n", buf);
char *tmp = realloc(buf, 20); // увеличение буфера
if (!tmp) { free(buf); perror("realloc"); return EXIT_FAILURE; }
buf = tmp;
strcat(buf, " in C");
printf("%s\n", buf);
free(buf);
return EXIT_SUCCESS;
}
Пример — выделение и изменение массива целых
#include <stdio.h>
#include <stdlib.h>
int main(void) {
int *arr = malloc(10 * sizeof(int));
if (!arr) { perror("malloc"); return EXIT_FAILURE; }
/* ... использование массива ... */
int *tmp = realloc(arr, 50 * sizeof(int));
if (!tmp) { free(arr); perror("realloc"); return EXIT_FAILURE; }
arr = tmp;
printf("Array resized successfully\n");
free(arr);
return EXIT_SUCCESS;
}
Практические советы
- Предпочитайте
size_tдля аргументов размера, чтобы избежать ошибок со знаковыми числами. - При уменьшении блока данные за новым размером отбрасываются.
- Всегда проверяйте возвращаемое значение перед использованием указателя.
- Используйте
free()ровно один раз для каждого успешного выделения.
Язык C
- Как молибден формирует современную промышленность: применение, преимущества и динамика поставок
- Использование Azure DevOps: проверенные практики для ускоренной доставки
- Освоение функций VHDL: практическое руководство по эффективному дизайну
- Превратите собранный пазл в вечный шедевр с эпоксидной смолой
- calloc() в C: выделение обнулённой памяти и практический пример
- Освоение функции free() в C: практическое руководство и пример
- Основное руководство: когда и как безопасно использовать огнетушитель
- Мастерство работы с краскопультами: профессиональное руководство для равномерного и безопасного покрытия
- Использование термистора: пошаговое руководство для Arduino
- Освоение техник шлифовального станка для режущих инструментов: практическое руководство