Hej :)
Muszę rozpisać poniższą funkcję z pewnego zadania:
int load_words(char ***words, const char *filename);
Funkcja wczytuje listę słów z pliku words do tablicy words.
Tablicę wskaźników na słowa *words należy zakończyć wartością NULL.
Wyrazy w pliku zapisane są w następujący sposób (dla każdego słowa):
4 bajty - długość n wyrazu (bez terminatora),
n bajtów - kolejne znaki słowa (bez terminatora).
Funkcja może zaalokować na tablicę wynikowę words jedynie tyle pamięci ile będzie potrzebne do przechowywania listy wyrazów.
Wartość zwracana: 0 - w przypadku sukcesu.
1 - w przypadku przekazania błędnych danych,
2 - w przypadku, gdy plik nie istnieje,
3 - w przypadku stwierdzenia uszkodzonej zawartości pliku,
4 - w przypadku niepowodzenia alokacji pamięci,
W przypadku wystąpienia błędu funkcja powinna ustawić *words wartością NULL.
Na tą chwilę tak mam to rozpisane:
nt load_words(char ***words, const char *filename)
{
if( words == NULL || filename == NULL )
{
return 1;
}
FILE *f = fopen(filename,"r");
if( f == NULL )
{
return 2;
}
int c = 'a';
int i = 0;
int rows = 0;
while( c != EOF )
{
c = fgetc(f);
if( c == '\n' )
{
rows++;
}
i++;
}
fseek(f,0,SEEK_SET);
rows++;
if( i == 0 )
{
fclose(f);
return 3;
}
*words = (char **) malloc(sizeof(char *) * (rows + 1));
if( *words == NULL )
{
fclose(f);
return 4;
}
int j = 0;
int licznik = 0;
while( c != EOF && licznik < rows )
{
c = fgetc(f);
j++;
if( c == '\n')
{
*( (*words) + licznik ) = (char *)malloc(sizeof(char) * j);
if( *( (*words) + licznik ) == NULL )
{
int get_out;
for(get_out = 0; get_out < licznik; get_out++)
{
free(*( (*words) + get_out ));
}
fclose(f);
free(*words);
return 4;
}
licznik++;
j = 0;
}
}
*((*words) + rows) = NULL;
fseek(f,0,SEEK_SET);
j = 0;
licznik = 0;
while( c != EOF && i < rows )
{
c = fgetc(f);
if( c != EOF )
{
*(*( (*words) + i) + j) = c;
if( c == '\n')
{
*(*( (*words) + i) + j) = '\0';
i++;
j = 0;
}
else
{
j++;
}
}
}
fclose(f);
return 0;
}
Jednak na testach ciągle jestem informowany, że są jakieś błędy z alokacją. Między innymi:
iczba niezwolnionych bloków pamięci: 1 blok(ów)⏎
Sumaryczna wielkość wycieku pamięci: 16 bajt(ów)⏎
Wydawało mi się, że wszystko dobrze zabezpieczam, ale najwyraźniej czegoś brakuje. Ponadto mam wrażenie, że w mojej funkcji coś jednak niepoprawnie przeprowadzam alokację i czegoś brakuje. Tak więc proszę was, abyście wypowiedzieli się jakiego braku zabezpieczenia dotyczy powyższy wyciek pamięci, a także czy na chwilę obecną mój tok myślenia jest prawidłowy. Z góry dziękuję za wszelkie odpowiedzi. :)