Dlaczego gcc zezwala na inicjalizację tablicy char z literałem łańcuchowym większym niż tablica?
int main()
{
char a[7] = "Network";
return 0;
}
A literał ciągu w C jest wewnętrznie zakończony za pomocąnul charakter. Powyższy kod powinien więc dać błąd kompilacji, ponieważ rzeczywista długość literału łańcuchowegoNetwork
ma 8 i nie może zmieścić się wchar[7]
szyk.
Jednak,gcc (nawet z-Wall
) na Ubuntu kompiluje ten kod bez żadnego błędu lub ostrzeżenia. Dlaczego gcc pozwala na to i nie zaznacza go jako błąd kompilacji?
gcc wyświetla ostrzeżenie (nadal bez błędu!), gdy rozmiar tablicy znaków jest mniejszy niż literał ciągu. Na przykład ostrzega przed:
char a[6] = "Network";
[Związane z]Visual C ++ 2012 daje błąd kompilacji dlachar a[7]
:
1>d:\main.cpp(3): error C2117: 'a' : array bounds overflow
1> d:\main.cpp(3) : see declaration of 'a'