2010-12-28 10 views
11

No entiendo el motivo de un error de segmentación en mi programa. El código está disponible hereDeclaración de fallo de segmentación de causas variables

En la línea 29, declaro una variable PclImage, definida con typedef como una matriz de struct. La definición de PclImage tipo es el siguiente (de fichero src/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]; 

El programa funciona bien, pero cuando me declaro un segundo PclImage, me sale un fallo de segmentación en cuanto lanzar el programa.

Por ejemplo, si en la línea 30 del primer archivo agrego PclImage bgPcl;, el programa se bloquea inmediatamente.

¿Alguien me puede ayudar?

Respuesta

14

Si declara PclImage como una variable local (en la pila), es probable que obtenga una falla de segmentación debido a un desbordamiento de la pila.

PclImage es una matriz con 307.200 elementos, cada uno de los cuales tiene (probablemente) unos 20 bytes de tamaño, por lo que toda la matriz tiene un tamaño aproximado de 6 MB. Es muy poco probable que la pila sea lo suficientemente grande como para contener dos de esas matrices; es posible que ni siquiera sea lo suficientemente grande como para contener uno (como regla general, generalmente es seguro en la mayoría de los sistemas operativos de escritorio suponer que tiene al menos 1MB de espacio de pila disponible).

Cuando tenga objetos tan grandes, debe asignarlos dinámicamente (utilizando malloc y sus amigos) o, si no le preocupa la reentrada, estáticamente.

1

Estoy de acuerdo con James en que la asignación de esos grandes arreglos en la pila es la causa más probable. Sin embargo, cada PclImage solo suma unos 6 Meg cada uno. A menos que esté operando en un entorno de memoria limitada, esto debería ser factible. He asignado matrices mucho más grandes en la pila antes. Incluso en sistemas integrados.

La sugerencia de James de usar malloc probablemente lo arreglará (vale la pena intentarlo solo para verificar el problema). Sin embargo, considero una buena política evitar la asignación dinámica cuando sea posible. Las posibles alternativas a malloc serían declarar las matrices en contexto externo o aumentar el tamaño de la pila de su hilo. Los procesos y/o subprocesos creados por el usuario a menudo tienen acumulaciones bastante pequeñas asignadas de manera predeterminada. Puede ser una cuestión bastante simple encontrar dónde se establece y darle una pila lo suficientemente grande para sus necesidades.

Por ejemplo, si se ejecuta desde un subproceso creado con la rutina Windows CreateThread(), el segundo parámetro controla el tamaño de la pila. Si lo predetermina con un 0 (como la mayoría de la gente lo hace), toma el tamaño de pila predeterminado. Tan cerca como puedo decir, eso es "solo" 1 MB.

+0

Se ha sobredimensionado drásticamente la memoria en un sistema integrado. Tener más de 32K de RAM es enorme. . . y lo estoy tomando desde la perspectiva de 2017. En 2010, sentí que 16K era la disponibilidad en partes en las que derrochamos RAM. – iheanyi

+0

@iheanyi - Como se dijo en los comentarios, algunos dispositivos tienen memoria limitada, pero estaba hablando por experiencia aquí, no por especulación. Por supuesto, mmm, pero eso no significa que todos los desarrolladores integrados estén trabajando en un sistema como los que trabajas. –

Cuestiones relacionadas