2015-09-22 13 views
8

Mam tablicę 3 elementów. Ale chcę tylko zainicjować 2 z nich. Pozwoliłem, aby trzeci element był pusty.Wartość niezainicjowanych elementów w tablicy języka C

unsigned char array[3] = {1,2,}; 
int main(){ 
    printf("%d",array[2]); 
    return 0; 
} 

Wynik drukowania wynosi 0. Przetestowałem go na IAR i na niektórych kompilatorach online.

Czy istnieje jakaś reguła C dla wartości trzeciego elementu? Czy jest jakikolwiek kompilator wypełniający trzeci element przez 0xFF? (Zwłaszcza kompilator krzyżowy)

Odpowiedz

10

Tak, standard C określa, co dzieje się w tym przypadku. Więc nie, nie powinno być żadnego kompilatora zgodnego ze standardem C, który w tym przypadku ma postać 0xFF.

Sekcja 6.7.9 normy mówi:

Inicjalizacja

...

10 ... Jeśli obiekt, który ma statyczną lub nitki czas przechowywania nie jest Zainicjowano jawnie, a następnie:

  • , jeśli ma typ wskaźnika , jest inicjalizowany do wskaźnika pustego;
  • jeśli ma typ arytmetyczny, to jest zainicjowany na (zero lub zero);
  • jeśli jest to agregacja, każdy element jest inicjowany (rekursywnie) zgodnie z tymi regułami, i wszelkie dopełnianie jest inicjowane na zero bitów;
  • jeśli jest to związek, pierwszy nazwany element jest inicjowany (rekurencyjnie) zgodnie z tymi regułami, a każde dopełnienie jest inicjowane na zero bitów;

...

21 Jeśli istnieje mniej inicjalizatory na liście Brace-zamknięty niż tam są elementy lub członkowie agregatu lub mniej znaków w Łańcuch znaków używanych zainicjować tablicę znany rozmiar niż są elementami w tablicy, pozostała część agregatu musi być zainicjowana niejawnie tak samo jak obiekty, które mają czas przechowywania statycznego .

0

Od posta this wydaje się, że ta składnia zainicjuje wszystkie elementy po przecinku do zera. Co więcej; wszystkie niezainicjowane dane w segmencie danych programu (innymi słowy wszystkie niezainicjowane zmienne globalne) są automatycznie ustawiane na zero, więc jeśli szukasz nieokreślonego zachowania w tym programie, nie ma żadnego; zawsze będzie 0.

0

Można to osiągnąć przez rozszerzenie gcc poniżej: unsigned char array [10] = {1,2, [2 ... 9] = 0xFF};

+2

To nie odpowiada na pytanie. OP chciał wiedzieć, czy istnieje reguła dla jakiej wartości nieokreślone indeksy są inicjowane (tam) i czy każdy kompilator domyślnie zainicjuje je na 0xFF (nie zrobiłby tego żaden zgodny ze standardem kompilator). –

Powiązane problemy