Найдите и объясните ошибку в C‑фрагменте, связанный с управлением памятью, и предложите безопасную корректировку:
char *concat(const char *a, const char *b) {
char *s = malloc(strlen(a) + strlen(b))

12 Окт в 08:20
8 +8
0
Ответы
1

Главная ошибка — недостаточно выделенной памяти: в malloc выделяется strlenaaa + strlenbbb байт, но для C‑строки нужно ещё место для завершающего нулевого символа '\0'. При последующем копировании/сцеплении строк запись нуля выйдет за границы буфера — UB переполнениебуферапереполнение буферапереполнениебуфера.

Кроме того надо проверять результат malloc и желательно корректно обрабатывать NULL‑входы.

Безопасная корректировка безлишнихзависимостейбез лишних зависимостейбезлишнихзависимостей:

include include

char concatconstchar</em>a,constchar<em>bconst char </em>a, const char <em>bconstchar</em>a,constchar<em>b {
if !a!a!a a = ""; / при желании считать NULL как пустую строку /
if !b!b!b b = "";
size_t la = strlenaaa, lb = strlenbbb;
char s = mallocla+lb+1la + lb + 1la+lb+1; / +1 для '\0' /
if s==NULLs == NULLs==NULL return NULL; / проверка ошибок выделения /
memcpys,a,las, a, las,a,la;
memcpys+la,b,lbs + la, b, lbs+la,b,lb;
sla+lbla + lbla+lb = '\0';
return s; / caller обязан freesss /
}

Альтернативные варианты:

Можно использовать strcpy/strcat после выделения la+lb+1, но memcpy быстрее и безопаснее, если длины известны.На GNU можно использовать asprintf(&s, "%s%s", a, b) возвращает−1приошибкеивыделяетпамятьавтоматическивозвращает -1 при ошибке и выделяет память автоматическивозвращает1приошибкеивыделяетпамятьавтоматически.

И не забывайте: освобождать возвращённый буфер freefreefree вызывающей стороне.

12 Окт в 09:38
Не можешь разобраться в этой теме?
Обратись за помощью к экспертам
Гарантированные бесплатные доработки в течение 1 года
Быстрое выполнение от 2 часов
Проверка работы на плагиат
Поможем написать учебную работу
Прямой эфир