Главная ошибка — недостаточно выделенной памяти: в malloc выделяется strlenaaa + strlenbbb байт, но для C‑строки нужно ещё место для завершающего нулевого символа '\0'. При последующем копировании/сцеплении строк запись нуля выйдет за границы буфера — UB переполнениебуферапереполнение буферапереполнениебуфера.
Кроме того надо проверять результат malloc и желательно корректно обрабатывать NULL‑входы.
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 вызывающей стороне.
Главная ошибка — недостаточно выделенной памяти: в malloc выделяется strlenaaa + strlenbbb байт, но для C‑строки нужно ещё место для завершающего нулевого символа '\0'. При последующем копировании/сцеплении строк запись нуля выйдет за границы буфера — UB переполнениебуферапереполнение буферапереполнениебуфера.
Кроме того надо проверять результат malloc и желательно корректно обрабатывать NULL‑входы.
Безопасная корректировка безлишнихзависимостейбез лишних зависимостейбезлишнихзависимостей:
include includechar 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 вызывающей стороне.