При использовании функции strcat() появляется ошибка (в любой момент, если вызвать функцию не один раз):
char *g = strcat(strdup(f),strdup(f));
Ошибка такая:
03-31 14:59:24.163 29228-29228/optichat.testotest A/libc: invalid address or address of corrupt block 0xb8facbe0 passed to dlfree
03-31 14:59:24.164 29228-29228/optichat.testotest A/libc: Fatal signal 11 (SIGSEGV), code 1, fault addr 0xdeadbaad in tid 29228 (ichat.testotest)
Как решить эту проблему?
Символьный массив, возвращаемый функцией strdup(f), не имеет достаточно место для включения самого себя.
char *g = strcat(strdup(f),strdup(f));
Массив, используемый в качестве первого аргумента функции, должен иметь достаточно место, чтобы в него можно было дописать строку. Для приведенного вызова его размер должен быть равен по крайней мере 2 * strlen( f ) + 1.
К тому имеет место утечка памяти, так как адрес динамически созданного массива для второго аргумента, теряется, и созданный массив невозможно удалить.
Вы не можете "на лету" создавать таким образом новые строки.
Если это C++ программа, то следует использовать стандартный класс std::string
Тогда можно записать просто
std::string s( f );
s += f;
Или в качестве временного выражения
std::string( f ) + f
Если же это C программа, то примерный код может выглядеть следующим образом
char *s = malloc( 2 * strlen( f ) + 1 );
strcat( strcpy( s, f ), f );
//...
free( s );
То же самое на C++ будет выглядеть как
char *s = new char[2 * strlen( f ) + 1];
strcat( strcpy( s, f ), f );
//...
delete [] s;
Как развивать веб-проекты в 2026 году: технологии, контент E-E-A-T и факторы доверия
Современные инструменты для криптотрейдинга: как технологии помогают принимать решения
Апостиль в Лос-Анджелесе без лишних нервов и бумажной волокиты
Основные этапы разработки сайта для стоматологической клиники