2013-05-21 23 views
5

In C:C: come gestire una struttura di grandi dimensioni?

Sto tentando di utilizzare una struttura contenente un array di grandi dimensioni e ho un errore di overflow dello stack mentre lo dichiaro. Immagino (correttamente?) Che non abbia abbastanza memoria nello stack, e quindi, dovrei usare l'heap (non voglio cambiare la mia dimensione della memoria dello stack, dato che il codice verrà usato da altri). Qualcuno potrebbe mostrarmi un modo per farlo semplicemente? O dovrei usare qualcosa di diverso da una struttura?

Il mio codice - definitions.h:

#define a_large_number 100000 

struct std_calibrations{ 
    double E[a_large_number]; 
}; 

Il mio codice - main.c:

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

    // Stack overflows here: 
    struct std_calibrations calibration; 

    /* ... 
    */ 

    return (0); 
} 

Grazie per il vostro aiuto!

+3

'static struct std_calibrations calibration;' – BLUEPIXY

risposta

7

un paio di opzioni:

  1. Usa malloc(3) e free(3) per allocare dinamicamente la struttura in fase di esecuzione. Questa opzione è ciò di cui stai parlando quando dici "dovresti usare l'heap".

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

    e più tardi,

    free(calibration); 
    
  2. Dare la durata di archiviazione statica della struttura. Aggiungere una parola chiave static o renderla globale. Questa opzione può cambiare alcune semantiche su come usi la struttura, ma dato il tuo codice di esempio, dovrebbe andare bene.

+0

Grazie. Dopo aver faticato un po ', ho dichiarato la mia struttura come globale e funziona. Tornerò alla tua soluzione più tardi per migliorare il mio codice, ma al momento sono contento che funzioni. – user2076688

4

Cambiare il membro E per essere una memoria double* e malloc() per esso:

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

e ricordarsi di free(calibration->E); quando non sono più necessari. Sarebbe possibile estendere struct std_calibrations, se lo si desidera, per contenere il numero di elementi in E in modo che un utente di struct std_calibrations possa decidere quanti elementi richiedono.

Problemi correlati