2013-09-21 10 views
5

Zazwyczaj kiedy zainicjować tablicę, to pewnie zrobić:Czy można mieć nadmiar elementów w inicjatorze macierzy?

int arr[] = {1, 2, 3, 4, 5}; 

Ale to jest ok, aby wyraźnie ograniczyć długość tablicy jak poniżej? :

int arr[3] = {1, 2, 3, 4, 5}; 

Mimo pewnych ostrzeżeń z kompilatora, plik wykonywalny nie wydaje się mieć żadnych problemów.

+3

Ale po co to robić? – aaronman

+1

Zazwyczaj dobrze jest zwrócić uwagę na ostrzeżenia. Ale kompilator jest wystarczająco łaskawy, aby zignorować twoje gadaniny na dodatkowych elementach. Jednak czuję, że to niechlujne programowanie. –

+0

Na czym polega motywacja? Nie widzę żadnego praktycznego zastosowania, dlaczego ma to znaczenie? –

Odpowiedz

8

Nie, to nie jest w porządku. Z C99, 6.7.8.2:

Ograniczenia

  1. Nie initializer będą starać się zapewnić wartość dla obiektu nie zawartych w jednostce jest zainicjowany.

W moim odczytu, oznacza to, że zapewnienie nadmiar elementów inicjująca jest naruszeniem ograniczenie, więc wywołuje niezdefiniowanej zachowanie.

+0

Aby wyjaśnić, masz na myśli, że w powyższym przykładzie arr [5] i powyżej jest zdefiniowane zachowanie, ale arr [4] i poniżej jest niezdefiniowany? – Pacerier

+1

@Pacerier Jeśli poprawnie zrozumiem standard, to tak, dokładnie. –

Powiązane problemy