2010-05-23 19 views
5

Powiedzmy mam tablicę jakJak zainicjować tablicę do czegoś w C bez pętli?

int arr[10][10]; 

Teraz chcę zainicjować wszystkie elementy tej tablicy do 0. W jaki sposób można to zrobić bez pętli lub określając każdy element?

Należy pamiętać, że ta kwestia, czy dla C

+0

Duplikat: http://stackoverflow.com/questions/201101/how-to-initialize-an-array-in-c – ptomato

Odpowiedz

11

quick-n-brudne rozwiązanie:

int arr[10][10] = { 0 }; 

Jeśli zainicjować dowolny element tablicy, domyślnie C-zainicjować żadnego elementu, który nie wyraźnie określić. Zatem powyższy kod inicjuje pierwszy element do zera, a C ustawia wszystkie pozostałe elementy na zero.

+1

Spowoduje to zainicjowanie wszystkich elementów na 0? Dlaczego mówisz, że jest brudny? – Laz

+9

Aby wyjaśnić: nie "podąża za tym", * zmusza * je do zera. Jeśli napisałeś '= {1} ;, to umieści pierwszą wartość jako 1, a reszta będzie nadal zerami. –

+1

Mówię szybko-n-brudny, ponieważ, mimo że jest logicznie poprawny i gwarantowany, może mylić opiekunów. Uważam to za skrót i nie używam go, chyba że struktura tablicy lub danych jest zbyt duża, aby wygodnie zainicjować każdy element. –

1
int myArray[2][2] = {}; 

Nie trzeba nawet pisać zero wyraźnie.

+0

Jest to nieprawidłowy typ tablicy i dziwnie wyglądające "zero". –

+0

Tak, przepraszam za to. Zaktualizowano. –

+0

Myślę, że w C trzeba napisać zero (puste nawiasy są jednak prawidłowe C++). – avakar

4
int arr[10][10] = {0}; // only in the case of 0 
5

Poza składni inicjalizacji, zawsze można memset(arr, 0, sizeof(int)*10*10)

+0

Należy pamiętać, że nadal trwa to O (N) dla elementów N. Z drugiej strony jest to prawdopodobnie szybszy O (N) niż ten, który kodujesz ręcznie (lub przynajmniej nie wolniej). – dmckee

+0

Na membranie używa się pętli, więc to nie odpowiada na pytanie. – SoapBox

+0

'memset' może być również niepoprawny dla tablic wskaźnika lub zmiennoprzecinkowych. –

3

Masz szczęście: 0, to jest to możliwe.

memset(arr, 0, 10 * 10 * sizeof(int)); 

Nie można tego zrobić z inną wartość niż 0, ponieważ memset prac nad bajtów, a nie na int s. Ale wszystkie bajty o długości int zawsze będą miały wartość 0.

+1

Można to również zrobić z ~ 0 – geocar

+1

... inicjalizując wszystkie elementy do -1. Dobra uwaga, nie myślałem o tym. – Thomas

+0

Możesz to zrobić z dowolną inną wartością, która, jako bajty, składa się z tej samej wartości w każdym bajcie. 'n * (UINT_MAX + 1ULL)/255' jest rodziną takich wartości (' n' = 0,1, ..., 'UCHAR_MAX'). –

0

int arr [10] [10] = {0};

Powiązane problemy