Podczas przeglądania jednego z moich projektów trafiłem na mój błąd,którym jest zadeklarowanie i użycie tablicy o zerowym rozmiarze (używając jej szkodze pamięci,czyż nie?)
void TranslateFile(struct keyElem* guard,FILE* inpFile,FILE* outFile)//"tłumaczy" plik spowrotem
{
char x;
char c[0] = {""};
char tab[100] = {""};
char empty[100] = {""};
while((feof(inpFile)==0))
{
fscanf(inpFile,"%c",&x);
if(x==' ')
{
c[0] = SearchChar(guard,tab);
fprintf(outFile,"%s",c);
strcpy(tab,empty);
x = '\0'; //puts(tab);
}
if(x != ' ')
{
c[0] = x;
strcat(tab,c);
}
}
}
Próbowałem to zmienić na
char c[1]; // tablica z jednym elementem
c[0] = '\0'; //pusty znak w miejsce pierwszego(jedynego)elementu
Jednak program nie działa poprawnie,ale nie wiem czemu i nie potrafie tego rozpracować.(O dziwo stara wersja z tablicą o zerowym rozmiarze działa bez zarzutu)
Funkcja działa tak:
Czyta znak z pliku binarnego w którym są ciągi 0 i 1 oddzielone spacją (np 01 011 001 01 00011)
Jeżeli trafi na spacje,czyli koniec pojedynczego ciągu:
przypisuje do c znak znaleziony za pomocą SearchChar(); //SearchChar przeszukuje liste jednokierunkową
wpisuje c do nowego pliku
"czyści" tablicę tab
Jeżeli znak jest różny od spacji (0 albo 1):
przypisuje do c ten znak
dokleja c do tab
Ktoś ma pomysł,czemu druga "poprawna" wersja nie działa,tudzież czemu "nielegalna" działa bez zarzutu?