Если вы работаете в POSIX-совместимой системе (любой современной Linux), не пытайтесь изобретать велосипед заново. Просто используйте getline()
. Он сделает сложную работу по управлению растущим буфером для вас и вернет подходящую malloc()
'ed строку.
Вы присваиваете результат malloc()
/ realloc()
для s
вместо *s
. s
является чисто локальным по отношению к readstring()
, *s
является переменной-указателем, на которую указывает s
. Передайте адрес указателя в main. Правильный код выглядит следующим образом:
void foo(char** out_string) {
*out_string = malloc(...);
}
int main() {
char* string;
foo(&string);
}
Без адреса, принимающего &
и разыменования указателя *
, ваш main()
не может знать, где readstring()
хранит символы.
Вам также нужно разыменовать двойной указатель при установке символов строки: используйте (*s)[i]
вместо s[i]
, так как s[i]
обозначает указатель, а не символ.
Также, попробуйте запустить вашу программу с valgrind
, и посмотрите, сможете ли вы узнать из ошибок, которые она вам выдаст. Это отличный инструмент для отладки проблем, связанных с памятью.