2015-04-08 14 views
7

Poniższy kod powinien generować błąd, ponieważ nie ma możliwości, aby kompilator znał rozmiar tablicy podczas kompilacji.Dlaczego ten kod nie powoduje błędu przy użyciu zmiennej wielkości tablicy?

int f; 
std::cin >> f; 
int c[f]; 
c[100] = 5; 

Mam kompilacji z gcc (4.8.2-19ubuntu1 Ubuntu) 4.8.2 i nie tylko skompilować, ale działa jakoś.

Jak to się dzieje?

+0

Zobacz [Czy "int size = 10;" daje ciągłe wyrażenie?] (Http://stackoverflow.com/q/21273829/1708801) o wiele więcej szczegółów na ten temat. –

Odpowiedz

1

C++ nie sprawdza granic tablic. Numer line c[100] = 5; jest równoważny *(c + 100) = 5;. Po prostu mówisz kompilatorowi, aby zapisał w pamięci z pewnym przesunięciem z innej lokalizacji w pamięci. Jeśli wprowadzisz do programu mniej niż 100, będziesz nadpisywać niektóre dane na stosie. W zależności od tego, co zrobi reszta kodu, może to spowodować przepełnienie stosu, "losową" awarię, ponieważ niektóre ważne dane są nadpisywane lub mogą działać poprawnie (a następnie zaczynają losowo awarię później, gdy niektóre pozornie niepowiązane zmiany zmieniają układ pamięci).

+4

Twój opis jest poprawny, ale nie jest tak naprawdę związany z pytaniem, które naprawdę dotyczy tego, dlaczego wiersz 'int c [f];' kompiluje, gdy 'f' nie jest stałą w czasie kompilacji .. – BoBTFish

+0

Zidentyfikowałem tę część. Właśnie dodałem go, aby upewnić się, że faktycznie tworzyłem tablicę. Sądzę jednak, że może to być przydatne dla innych osób, które zetkną się z tym pytaniem. – v010dya

Powiązane problemy