Столкнулся с проблемой, понять которую пока не смог. Может кто что понимает? Выкристаллизовал все в код:
#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 компиляторами - один хрен.
Ответ на:
комментарий
от vasily_pupkin

Ответ на:
комментарий
от vasily_pupkin

Ответ на:
комментарий
от alex_custov

Ответ на:
комментарий
от atoku
Ответ на:
комментарий
от atoku

Ответ на:
комментарий
от vasily_pupkin

Ответ на:
комментарий
от alex_custov

Ответ на:
комментарий
от alex_custov

Ответ на:
комментарий
от atoku
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.
Похожие темы
- Форум покритикуйте функцию (2009)
- Форум Программа на Си падает, при выделении памяти (2014)
- Форум c и iconv - помогите разобраться (2008)
- Форум проблема массивом указателей (2008)
- Форум scanf(«%s»,char*) Что-то не так :( (2011)
- Форум А что можно было? (2013)
- Форум Чем чревата прямая инкапусляция структур в си? (2016)
- Форум Проблема с деструктором класса (2002)
- Форум Segmentation fault (2003)
- Форум Правильно ли я организовал выделение памяти? (2014)