2010-12-28 7 views
11

Non riesco a capire il motivo di un errore di errore di segmentazione nel mio programma. Il codice è disponibile hereDichiarazione di causa variabile errore di segmentazione

Alla riga 29, dichiaro una variabile PclImage, definita con typedef come una matrice di struct. La definizione di PclImage tipo è il seguente (da src/ file di libMyKinect.h):

typedef struct { 
    int valid; 
    float x; 
    float y; 
    float z; 
    unsigned char blue; 
    unsigned char green; 
    unsigned char red; 
} Point3d; 

typedef Point3d PclImage[480][640]; 

Il programma funziona bene, ma quando dichiaro un secondo PclImage, ottengo un errore di segmentazione non appena ho avvia il programma.

Ad esempio, se alla riga 30 del primo file aggiungo PclImage bgPcl;, il programma si arresta immediatamente.

Qualcuno può aiutarmi?

risposta

14

Se si dichiara uno PclImage come variabile locale (nello stack), è probabile che si verifichi un errore di segmentazione a causa di un sovraccarico dello stack.

PclImage è un array con 307.200 elementi, ognuno dei quali è (probabilmente) di circa 20 byte di dimensioni, quindi l'intero array ha una dimensione di circa 6 MB. È altamente improbabile che lo stack sia abbastanza grande da contenere due di quegli array; potrebbe non essere nemmeno abbastanza grande da contenere uno (come regola generale, di solito è sicuro sulla maggior parte dei sistemi operativi desktop per supporre di avere almeno 1 MB di spazio disponibile sullo stack).

Quando si dispone di oggetti di grandi dimensioni, è necessario allocarli dinamicamente (utilizzando malloc e amici) o, se non si è interessati alla rientranza, staticamente.

1

Concordo con James sul fatto che allocare quei grandi array in pila è molto probabilmente la causa. Tuttavia, ogni PclImage somma fino a circa 6Meg ciascuno. A meno che non operi in un ambiente con memoria limitata, questo dovrebbe essere fattibile. Ho già assegnato array molto più grandi in pila. Anche su sistemi embedded.

Il suggerimento di James di utilizzare malloc probabilmente lo risolverà (vale la pena provare solo per verificare il problema). Tuttavia, trovo una buona politica evitare l'allocazione dinamica quando possibile. Eventuali alternative a malloc sarebbero dichiarare gli array nel contesto esterno o aumentare le dimensioni dello stack del thread. I processi e/o i thread creati dagli utenti hanno spesso stack piuttosto piccoli assegnati per impostazione predefinita. Può essere una questione abbastanza semplice trovare dove è impostato e dargli uno stack abbastanza grande per le tue esigenze.

Ad esempio, se viene eseguito da un thread creato con la routine Windows CreateThread(), il secondo parametro controlla la dimensione dello stack. Se lo si predefinisce con un 0 (come la maggior parte della gente), prende la dimensione dello stack predefinita. Per quanto posso dire, questo è "solo" 1 MB.

+0

Si stima eccessivamente la memoria in un sistema incorporato. Avere più di 32 KB di RAM è enorme. . . e sto prendendo dalla prospettiva del 2017. Nel 2010, sentivo 16K era la disponibilità in parti in cui abbiamo speso per RAM. – iheanyi

+0

@iheanyi - Come detto nei commenti, alcuni dispositivi sono a memoria limitata, ma stavo parlando per esperienza qui, non per speculazione. Ovviamente ymmv, ma questo non significa che ogni sviluppatore incorporato stia lavorando su un sistema come quelli su cui lavori. –