Algorytm może i dobry, ale źle wczytujesz.
Luknij na tutorial wczytywania z tego forum.
Nie znam się na mallocach i innych allocach, ale coś wydaje mi się, że mało pamięci alokujesz.
Radziłbym wczytywać tak:
gets(data[0]);
gets(data[1]);
gets(data[2]);
Ale wtedy daj:
char data[9][1000009];