test = realloc(test, buff);
Вы выделяете в первом realloc два байта , затем три байта ...., а не пространство для двух, трех ... указателей
Ваша программа - это просто одно огромное Неопределенное поведение
test = realloc(test, buff * sizeof(*test));
Кстати, все выделенные указатели будут указывать на одно и то же место в памяти.
test[i] = string;
не выделяет место для строки и не копирует ее.
test[0] == test[1] == test[2] .... ==test[n]
, которая является последней отсканированной строкой
для хранения всех отсканированных строк, которые необходимо выделить в память и скопировать строку
test[i] = malloc(strlen(string) + 1);
strcpy(test[i], string);