Столкнулся с проблемой, понять которую пока не смог. Может кто что понимает? Выкристаллизовал все в код:
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
void try_realloc( char* str )
{
const char *addstr = " more string ";
size_t len = strlen( str );
size_t addlen = strlen( addstr );
str = realloc( str, ( len + addlen + 1 ) * sizeof( char ) );
strncat( str, addstr, addlen+1 );
}
int main()
{
char *str = calloc( 1, sizeof(char) );
try_realloc( str );
printf( "%s\n", str );
try_realloc( str );
printf( "%s\n", str );
free( str );
return 0;
}
То есть берется нулевая строка, потом в нее дописывается нечто,
при этом необходимая память довыделяется. В этом конкретном примере
никаких проблем не происходит, но в абсолютно аналогичном, чуть более
сложном, указатель приезжал из функции освобожденным, естественно
возникал сегфолт на реаллок.
В этом коде valgrind орет о куче ошибок. (текст не привожу - вы
сами можете его получить).
Теперь рассмотрим аналогичный код. Разница минимальна, но
ошибок не происходит и валгринд тоже говорит, что все тип-топ.
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
char* try_realloc( char* str )
{
const char *addstr = " more string ";
size_t len = strlen( str );
size_t addlen = strlen( addstr );
str = realloc( str, ( len + addlen + 1 ) * sizeof( char ) );
strncat( str, addstr, addlen+1 );
return str;
}
int main()
{
char *str = calloc( 1, sizeof(char) );
str = try_realloc( str );
printf( "%s\n", str );
str = try_realloc( str );
printf( "%s\n", str );
free( str );
return 0;
}
То есть разница лишь в том, что функция возвращает указатель
на перераспределенную память. И все работает!!! В ЧЕМ ПРИКОЛ?
Пробовал компилить с gcc и PGI компиляторами - один хрен.
Форум —
Development

