2013-05-16 12 views
5

Kiedy uruchomić poniższy kod, to działa dobrze dla C:Dlaczego mogę używać zmiennej o kwalifikacjach stałych jako rozmiaru tablicy w C?

#include<stdio.h> 

int main(void) 
{ 

const int x=5; 
char arr[x]; 
printf("%d",sizeof(arr)); 

} 

Ale nie tylko miał czytałem wcześniej, że const zmienne wykwalifikowanych nie są real stałe (dlatego nie mogą one być stosowane w case warunku switch-case), ale ten Link z IBM potwierdza, że ​​(IBMLINK) i mówi:

const int k = 10; 
int ary[k];  /* allowed in C++, not legal in C */ 

Dlaczego więc wolno mi użyć const wykwalifikowanego zmiennej w C a s rozmiar tablicy bez żadnego błędu?

+2

Twój link IBM jest nieaktualny ze standardem C. Zamiast tego użyj odniesienia C, które zostało zaktualizowane w ciągu ostatnich 14 lat. – Lundin

+0

Zmieniłem tytuł i tekst z "indeksu" na "rozmiar". Termin index jest używany tylko wtedy, gdy używasz tablicy do wskazania jednego konkretnego członka. W deklaracji lub definicji deklarujesz rozmiar obiektu jako całości. –

Odpowiedz

10

c99 tablice wsparcie zmiennej długości, ale c90 nie obsługuje zmienne tablic długości, widać to wyraźniej, jeśli używasz gcc i spróbuj skompilować z tych argumentów:

gcc -std=c89 -pedantic 

to daje następujące ostrzeżenie:

warning: ISO C90 forbids variable length array ‘y’ [-Wvla] 

ale jeśli skompilować za pomocą c99 jest perfekcyjnie:

gcc -std=c99 -pedantic 

Jak wskazano przez Johna Bode'a od standardowych tablic o zmiennej długości w 2011 C (VLA) są teraz opcjonalne. Oto artykuł o VLA i Dr Dobbs, a także link do gcc docs wskazany przez Wayne'a Conrada.

+0

Czy to znaczy, że pod 'c99' indeks tablicy może być również zwrotem funkcji? – Jugni

+0

@Jugni To powinno być w porządku –

+0

Czy mogę stwierdzić, że pod 'c99' nie ma reguły, że długość każdej tablicy musi być znana kompilatorowi? To jest napisane w portalu IBM, że musi on być znany kompilatorowi. Więc czy możesz potwierdzić ostatnim razem, że nie ma takiego wymagania po 'c99'? Zwrot funkcji, czy nawet ogólnych ** zmiennych ** (z kwalifikatorem' const' lub bez niego) może być indeksem tablicowym? – Jugni