Problem z usunięciem błędu w kodzie.Tablica z zerowym rozmiarem.

Odpowiedz Nowy wątek
2017-05-19 18:36
Grunding
0

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?

Pozostało 580 znaków

2017-05-22 09:44
0

Dlaczego działało wcześniej - nie wiem, pewnie działało przez przypadek (ew sposobu w jaki kompilator zinterpretował c[0] i umieścił w pamięci). Dlaczego nie działa z tablicą o wielkości 1? Bo tablica typu char o wielkości 1 nie jest łańcuchem znaków (gdzie miejsce na znak końca '\0'), którego oczekuje funkcja strcat.

Napisz funkcję, która doda pojedyńczy znak do łańcucha. Sprawdź też, czy masz miejsce na dopisanie tego znaku. Nie używaj magic numbers (100). Zamiast tablicy empty do wyczyszczenia tablicy skorzystaj z:

#define MAX 100
 
...
 
memset(tab, 0, MAX);

Pozostało 580 znaków

Odpowiedz
Liczba odpowiedzi na stronę

1 użytkowników online, w tym zalogowanych: 0, gości: 1, botów: 0