Подобно тому, что другие упоминали в комментариях, оператор:
str3 = "Carrier";
заменяет значение str3 на адрес строкового литерала «Carrier», что приводит к потере адреса, возвращаемого функцией malloc (). .
Использование str3 затем в strcat () в качестве первого аргумента пытается изменить строковый литерал, что приводит к неопределенному поведению.
Используйте strcpy () или эквивалентные функции для копирования строк в C.