Копирование строки: почему портится соседняя память
Функция копирует строку в новую область памяти:
char *dup_name(const char *src) {
char *dst = malloc(strlen(src));
strcpy(dst, src);
return dst;
}
Программа работает, но санитайзер адресов сообщает о записи за границу выделенного блока, а изредка ломается соседняя структура в куче. Что не так?
- strlen не учитывает завершающий байт \0, поэтому выделено на байт меньше, чем пишет strcpy
- malloc не обнуляет выделенную память, из-за этого в строке остаётся мусор от предыдущих аллокаций — нужен calloc
- К памяти, полученной из malloc, нельзя применять strcpy: с такой памятью разрешено работать только через memcpy
- Параметр объявлен как const char *, а strcpy требует изменяемый источник, поэтому копирование идёт мимо буфера
