2010-09-15 22 views
11

Chcę zainicjować dwuwymiarową tablicę o rozmiarze zmiennym do zera. wiem, można to zrobić za ustaloną wielkości tablicy:zainicjować wielowymiarową tablicę C o rozmiarze zmiennym do zera

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

ale to nie działa, jeśli mogę to zrobić:

int i = 10; 
int j = 10; 
int myarray[i][j] = {0}; 

Czy istnieje sposób jedna linia robi to czy Muszę pętli nad każdym członkiem tablicy?

Dzięki

Odpowiedz

9

Nie można zainicjować za pomocą inicjatora, ale można memset() tablicę do 0.

#include <string.h> 

int main(void) { 
    int a = 13, b = 42; 
    int m[a][b]; 
    memset(m, 0, sizeof m); 
    return 0; 
} 

UWAGA: Jest to C99. W C89 deklaracja m (int m[a][b];) jest błędem.

+0

@ vittorio88: prawdopodobnie używasz kompilatora C++. W C wskaźnik do dowolnego obiektu ('m' sam, typu' int (*) [b] ') jest zgodny ze wskaźnikiem do unieważnienia (wpisz' void * '), który jest oczekiwany przez' memset() '. Więc nie ma problemów. – pmg

-1

Zmienna wielkość dwie tablice wymiarowe nie są obsługiwane w C. Jeden wymiar (nie mogę sobie przypomnieć, czy jest to pierwszy lub drugi) musi być stała. Polecam zapętlenie po zdefiniowaniu.

+0

-0,5 (zaokrąglone w górę) 'C99' obsługuje dwuwymiarowe tablice o zmiennych rozmiarach. – pmg

+0

Masz rację. mój błąd. – erelender

1

Jeśli otrzymasz wskaźnik do struktury danych, możesz spróbować memset.

+0

+1 - memset to zdecydowanie najlepszy sposób na inicjalizację tablic i nowych przydziałów pamięci, to na pewno działa w C++, więc warto spróbować w C. – ChrisBD

+0

@kbrimington: W większości kontekstów nazwa tablicy "zanika" do wskaźnika do jego pierwszy element. Działa to również w przypadku tablic wielowymiarowych, a ponieważ memset() przyjmuje "void *", nie ma problemu z typem wskaźnika, który sama nazwa tablicy. – pmg

+0

@pmg - Dzięki. Rozumiałem to; jednak doceniam wyjaśnienie. – kbrimington

0

Nie można utworzyć tablicy statycznej przy użyciu zmiennych niestałych. Spróbuj użyć dynamicznej alokacji:

int i = 10; 
int j = 10; 
size_t nbytes = i*j*sizeof(int); 
int* myarray = (int*) malloc(nbytes); 
memset(myarray,0,nbytes); 
+0

-0,5 (zaokrąglone w górę) w 'C99' ty ** DO ** może tworzyć statyczne tablice przy użyciu zmiennych niestanowiących stałych. – pmg

3

Online C99 Standard (n1256 draft) sekcja 6.7.8, pkt 3:

Rodzaj podmiotu zostać zainicjowany powinien być tablicą o nieznanej wielkości lub typ obiektu, który jest nie jest typem tablicy o zmiennej długości.

Podkreśl moje.

Jak wszyscy mówili, najlepiej jest użyć memset().

Powiązane problemy