2010-11-21 9 views
6

Mam tablicę, która chcę uczynić globalną i chcę zainicjować w wywołaniu funkcji. Chcę najpierw zadeklarować ją, nie wiedząc, że to rozmiar:C - Inicjowanie tablicy globalnej w funkcji

char str[]; 

a później go zainicjować:

str = char[size]; 

Jak mogę to zrobić? Jestem bardzo nowy, c i być może idę zupełnie niewłaściwie tutaj, każda pomoc byłaby bardzo ceniona.

Odpowiedz

7

Sposób wykonania tej operacji to malloc. Najpierw zadeklarować tylko wskaźnik:

char *str; 

Następnie w funkcji, którą malloc nim Init:

str = malloc(sizeof(*str) * size_of_array); 

ten przydziela size_of_array elementy rozmiaru str punkty (char w tym przypadku).

Należy sprawdzić, czy alokacja nie powiodło się:

if (str == NULL) { 
    // allocation failed 
    // handle the error 
} 

Normalnie trzeba się upewnić, że free tę przydzieloną pamięć, kiedy jesteś z nim zrobić. Jednak w tym przypadku str jest globalne, więc nigdy nie wychodzi poza zakres, a pamięć będzie free d, gdy program się zakończy.

+4

W C nie powinno naprawdę oddanych wynik malloc - ty tylko naprawdę trzeba to zrobić w C++ - należy go unikać w C, ponieważ może maskować w inny sposób pomocne ostrzeżenia. –

+2

Jeśli chcesz być ogólny, użyj 'sizeof (* str)', więc nie musisz powtarzać nazwy typu. Ponadto w C nie powinieneś rzucać wyniku malloc. –

+2

@Paul, @Ben: dzięki, zaktualizowałem anwer –

1
char* str; 

str = (char*)malloc(size*sizeof(char)); 

można pominąć *sizeof(char) od sizeof(char) == 1 definicji.

Nie zapomnij cofnąć przydział pamięci przy użyciu free

+2

Jeśli chcesz być ogólny, użyj 'sizeof (* str)', więc nie musisz powtarzać nazwy typu. Ponadto w C nie powinieneś rzucać wyniku malloc. –

+1

W C nie powinieneś naprawdę rzucić wyniku malloc - naprawdę musisz to zrobić tylko w C++ - powinno się go unikać w C, ponieważ może maskować w inny sposób pomocne ostrzeżenia. –

1

Tworzenie char* str; zamiast tablicy. Następnie przydzielić wymaganą ilość pamięci za pomocą funkcji malloc lub calloc i wykonać inicjalizację w samym wywołaniu funkcji.

2

Sprawdź swój globalny deklaracja tablicy wyglądać następująco:

char *str = NULL; 

Następnie w funkcji inicjalizacji zrobić coś takiego:

void init(int size) 
{ 
    ... 
    str = malloc(size * sizeof(char)); 
    ... 
} 
+1

'sizeof (char)' jest 1 z definicji. Jeśli chcesz napisać kod, który działa z dowolnym typem, użyj 'sizeof (* str)'. –

+0

@Ben: prawda, ale dobrze jest dodać 'sizeof' niezależnie od typu.Jestem w pełni świadomy argumentów na rzecz 'sizeof (* str)' ale nadal wolę 'sizeof (char)' w tym przypadku. –

Powiązane problemy