2013-10-02 15 views
7

Czy jest to poprawne w języku C?Definiowanie rozmiaru tablicy przy użyciu zmiennej

#include <stdio.h> 
int main() 
{ 
    int i = 5; 
    int a[i];  // Compiler doesn't give error here. Why? 
    printf("%d",sizeof(a)); //prints 5 * 4 =20. 4 is the size of integer datatype. 
    return 0; 
} 

Kompilator nie podaje błędu na wyciągu int a[i];. nie jest stała, to jak można ją pomyślnie skompilować? Czy to dlatego, że używam kompilatora gcc? Czy jest dozwolone w C++?

+0

Omówienie w [moja odpowiedź tutaj] (http://stackoverflow.com/a/21273849/1708801) o tym, co jest wyrażeniem stałym w odniesieniu do tablic o zmiennej długości jest istotne. –

Odpowiedz

17

Tak, jest to ważne od C99 i jest nazywane variable-length array (VLA). Innymi słowy, jest w oficjalnym języku od około 14 lat.

Nie, to nie jest poprawne w C++, see this question w celu uzyskania szczegółowych informacji.

Należy również pamiętać, że sizeof nie jest funkcją, więc można ją zapisać jako printf("%zu\n", sizeof a);, która również używa właściwego specyfikatora formatu dla wartości size_t.

+0

Ok dzięki. Czy gcc kompiluje program c używając reguł dla C++? Mogę zadeklarować zmienne po użyciu funkcji printf i nie daje błędu. – user221458

+3

@ user221458 Proszę * przeczytać * tekst o C99, ponieważ wydaje się, że jesteś bardzo nieświadomy języka, którego próbujesz użyć. Możesz deklarować zmienne bardziej swobodnie w C99. – unwind

+0

VLA jest również obsługiwany w C++. Właśnie to sprawdziłem. – user221458

0

chcę tylko dodać na zrelaksowanie się na to odpowiedzieć w C++ 14, nie będzie macierze runtime-size, które pracują prawie tak samo jak VLA.

patrz rozdział 8.3.4 w N3690 (array of runtime bound of T)

Wydają się być obsługiwane w dzyń-3,3 (w C++ trybie 1y), ale nie w GCC 4.8 (wsparcie powinno pochodzić z GCC 4.9) . Podczas pisania kodu w trybie pre-C++ 14 (C++ 03, C++ 11) Twój kod prawdopodobnie się skompiluje, ale powinien wysłać ostrzeżenie o użyciu funkcji C99 nieobsługiwanej w C++.

I zawsze należy skompilować z najbardziej pedantycznego ostrzeżeń włączone :)

2

Jest to ważny C99 nazywa Variable Length Array (VLA) gcc obsługuje VLA as an extension poza C99 trybie względem C++ zarówno gcc i clang obsługuje tablice o zmiennej długości jako rozszerzenie, mimo że jest to naprawdę funkcja o zmiennej długości.

można zbudować przy użyciu -pedantic argumentu w gcc i clang zarówno dadzą ostrzeżenie podobne do następujących: Oczekuje

warning: variable length arrays are a C99 feature [-Wvla-extension] 

sizeof pracować poprawnie z VLA chociaż będzie ona oceniana zamiast stała całkowita. Chociaż masz kod undefined behavior w swoim kodzie, ponieważ podałeś nieprawidłowy specyfikator formatu dla size_t, który jest zu, a nie d.C99 draft standard w sekcji 7.19.6.1Funkcją fprintf która sekcja printf „s odsyła do za format string ust mówi:

Jeżeli specyfikacja konwersja jest nieważny, zachowanie jest niezdefiniowane [.... ]

Powiązane problemy