int main()
{
char a[7] = "Network";
return 0;
}
ciąg dosłowne w C jest zakończony wewnętrznie z nul charakteru. Tak więc powyższy kod powinien dać błąd kompilacji, ponieważ rzeczywista długość literału literowego Network
wynosi 8 i nie może się zmieścić w tablicy char[7]
.Dlaczego gcc zezwala na inicjalizację tablic znakowych z literałem łańcuchowym większym niż tablica?
Jednak, gcc (nawet z -Wall
) na Ubuntu kompiluje ten kod bez żadnego błędu lub ostrzeżenia. Dlaczego gcc pozwala na to, a nie oznaczać go jako błąd kompilacji?
gcc daje tylko ostrzeżenie (nadal nie ma błędu!), Gdy rozmiar tablicy char jest mniejszy niż ciąg dosłownym. Na przykład, ostrzega na:
char a[6] = "Network";
[Pokrewne] Visual C++ 2012 daje błąd kompilacji dla char a[7]
:
1>d:\main.cpp(3): error C2117: 'a' : array bounds overflow
1> d:\main.cpp(3) : see declaration of 'a'
Być może kompilujesz kod jako C z gcc i jako C++ w visual studio. Są tylko pozornie podobnymi językami. – nos
@nos: Tak, to wyjaśnia zachowanie! Sądzę, że jest to jedna z tych drobnych różnic w C-podobnym kodzie między C i C++. –
To będzie błąd z g ++, jeśli dobrze pamiętam. – fayyazkl