c++ arrays segmentation-fault

c++ - Falla de segmentación en grandes tamaños de arreglo



arrays segmentation-fault (5)

El siguiente código me da un error de segmentación cuando se ejecuta en una máquina de 2 Gb, pero funciona en una máquina de 4 GB.

int main() { int c[1000000]; cout << "done/n"; return 0; }

El tamaño de la matriz es de solo 4Mb. ¿Hay un límite en el tamaño de una matriz que se puede usar en c ++?


Además, si se está ejecutando en la mayoría de los sistemas UNIX y Linux, puede aumentar temporalmente el tamaño de la pila con el siguiente comando:

ulimit -s unlimited

Pero ten cuidado, la memoria es un recurso limitado y con gran poder vienen grandes responsabilidades :)


En C o C ++, los objetos locales generalmente se asignan en la pila. Está asignando una matriz grande en la pila, más de lo que la pila puede manejar, por lo que está obteniendo un .

No lo asigne local en la pila, use otro lugar en su lugar. Esto se puede lograr haciendo que el objeto sea global o asignándolo en el montón global. Las variables globales son correctas, si no usa la de cualquier otra unidad de compilación. Para asegurarse de que esto no ocurra por accidente, agregue un especificador de almacenamiento estático; de lo contrario, simplemente use el montón.

Esto se asignará en el segmento BSS, que es parte del montón:

static int c[1000000]; int main() { cout << "done/n"; return 0; }

Esto se asignará en el segmento de DATOS, que también forma parte del montón:

int c[1000000] = {}; int main() { cout << "done/n"; return 0; }

Esto se asignará en alguna ubicación no especificada en el montón:

int main() { int* c = new int[1000000]; cout << "done/n"; return 0; }


Porque almacenas la matriz en la pila. Deberías almacenarlo en el montón. Vea este enlace para comprender el concepto del montón y la pila.


Probablemente estés recibiendo un desbordamiento de pila aquí. La matriz es demasiado grande para caber en el espacio de direcciones de la pila de su programa.

Si asigna la matriz en el montón, debería estar bien, suponiendo que su máquina tiene suficiente memoria.

int* array = new int[1000000];

Pero recuerde que esto requerirá que delete[] la matriz. Una mejor solución sería usar std::vector<int> y cambiar su tamaño a 1000000 elementos.


Su array se está asignando en la pila, en este caso intento asignar una matriz del mismo tamaño usando alloc.