Ошибка памяти Android NDK

232
02 апреля 2017, 04:52

При использовании функции 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)

Как решить эту проблему?

Answer 1

Символьный массив, возвращаемый функцией 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;
READ ALSO
c++ thread передача enum

c++ thread передача enum

Вот кусок кода, хочу его запустить отдельным потоком

198
Длительность аудио-файла Qt 5.7 QMediaPlayer

Длительность аудио-файла Qt 5.7 QMediaPlayer

Здравствуйте! Как получить длительность музыки в QMediaPlayer? Я сделал всё, что в моих силахduration возвращает всегда 0

246