Столкнулся с проблемой, понять которую пока не смог. Может кто что понимает? Выкристаллизовал все в код: #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)
- Форум c и iconv - помогите разобраться (2008)
- Форум Программа на Си падает, при выделении памяти (2014)
- Форум А что можно было? (2013)
- Форум scanf(«%s»,char*) Что-то не так :( (2011)
- Форум проблема массивом указателей (2008)
- Форум Чем чревата прямая инкапусляция структур в си? (2016)
- Форум Ошибка в коде... (2006)
- Форум Проблема с деструктором класса (2002)
- Форум Segmentation fault (2003)