2013-05-21 9 views
5

W C:C: jak zarządzać dużą strukturą?

Próbuję użyć struktury zawierającej dużą tablicę, a podczas deklarowania mam błąd przepełnienia stosu. Zgaduję (poprawnie?), Że nie mam wystarczającej ilości pamięci w stosie, a zatem powinienem używać sterty (nie chcę zmieniać rozmiaru pamięci stosu, ponieważ kod będzie używany przez innych). Czy ktoś może mi pokazać sposób na zrobienie tego po prostu? Czy powinienem użyć czegoś innego niż strukturę?

Mój kod - definitions.h:

#define a_large_number 100000 

struct std_calibrations{ 
    double E[a_large_number]; 
}; 

Mój kod - main.c:

int main(int argc, char *argv[]) 
{ 
    /* ... 
    */ 

    // Stack overflows here: 
    struct std_calibrations calibration; 

    /* ... 
    */ 

    return (0); 
} 

Dziękujemy za pomoc!

+3

statyczna kalibracja std_calibrations statycznej struktury; ' – BLUEPIXY

Odpowiedz

7

Kilka opcji:

  1. Zastosowanie malloc(3) i free(3) dynamicznie alokować swoje struktury w czasie wykonywania. Ta opcja jest tym, o czym mówisz, gdy mówisz, że "powinieneś używać sterty".

    struct std_calibrations *calibration = malloc(sizeof *calibration); 
    

    a później

    free(calibration); 
    
  2. Daj statyczny czas przechowywania struktury. Dodaj słowo kluczowe static lub zmień je na globalne. Ta opcja może zmienić niektóre semantyki dotyczące sposobu korzystania ze struktury, ale biorąc pod uwagę przykładowy kod, powinno być dobrze.

+0

Dzięki. Po niewielkim wysiłku deklarowałem swoją strukturę jako globalną i działa. Później wrócę do twojego rozwiązania, aby poprawić mój kod, ale teraz, cieszę się, że to działa. – user2076688

4

Zmiana członkiem E być double* i malloc() pamięć o nim:

struct std_calibrations calibration; 
calibration->E = malloc(sizeof(*calibration->E) * a_large_number); 

i pamiętają free(calibration->E); gdy nie są już potrzebne. Byłoby możliwe rozszerzenie struct std_calibrations, jeśli jest taka potrzeba, aby zawierała liczbę elementów w E, aby użytkownik o numerze struct std_calibrations mógł zdecydować, ile wymaganych elementów.

Powiązane problemy