to skoro padła odpowiedz jak poradzić sobie z problemem to powiem co poszło nie tak.
w językach kompilowanych, na przykład C oprócz zwykłej tablicy istnieje także statyczna czysta tablica.
Zaloguj się, aby zobaczyć kod
gdzie liczba to naprzykład
Zaloguj się, aby zobaczyć kod
podczas przejścia preprocesora jak kompilator widzi zapis
char liczba[10];
to nie wolno zakładać ze stworzy się 11 elementów(dodatkowy null na końcu)
nie wolno też zakładać że tablica będzie w 2 miejscach(wskaźnik na stosie i reszta na stercie).
kompilator będzie tak skracał, dopracowywał kod że będzie traktował czasami taką tablice jak kilka zmiennych, i zapis
Zaloguj się, aby zobaczyć kod
zwróci ilość elementów, czego nie da się zrobić z tablicami dynamicznymi.
porostu podczas działania preprocesora jak gdzieś natrafi się zapis
tablica[3]
to wcale od poziomu assemblera nie musi być odwołanie do tablicy, tylko do konkretnego miejsca. tak jest w przypadku całkowicie jawnych tablic, gdzie wiadomo jaka wielkość w trakcie kompilacji.
jeśli rzutujesz sobie tablice const char[] na const* char to kompilator nie ma żadnych szans żeby poznać wielkość takiej tablicy,
const* char to wskaźnik
natomiast
const char[] to tablica
to byłoby jedno i to samo gdyby nie optymalizacja kodu kompilatora.
w twoim przypadku wystąpiła jeszcze jedna rzecz printf będzie tak długo wypisywał ciąg bajtów aż nie trafi na pusty bajt(null),
jeśli kompilator podczas kompilacji zauważył statyczna tablice i wiedział ile ma dokładnie miejsca za alokować to nie alokował dodatkowego bajtu na null'a, bo w dalszej pracy i tak będzie wiedział jaki jest rozmiar takiej tablicy.
podczas gdy ty rzutowałeś na const char* program w runtime nie był już w stanie określić wielkości tablicy.