При использовании функции 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;
Кофе для программистов: как напиток влияет на продуктивность кодеров?
Рекламные вывески: как привлечь внимание и увеличить продажи
Стратегії та тренди в SMM - Технології, що формують майбутнє сьогодні
Выделенный сервер, что это, для чего нужен и какие характеристики важны?
Современные решения для бизнеса: как облачные и виртуальные технологии меняют рынок
Здравствуйте! Как получить длительность музыки в QMediaPlayer? Я сделал всё, что в моих силахduration возвращает всегда 0