En C o C++, los objetos locales se suelen asignar a la pila. Está asignando una matriz grande en la pila, más de lo que la pila puede manejar, por lo que obtiene un stackoverflow.
No lo asigne local en la pila, use otro lugar. Esto se puede lograr haciendo el objeto 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.
Este asignará en el segmento de BSS, que es una parte de la pila:
static int c[1000000];
int main()
{
cout << "done\n";
return 0;
}
Este asignará en el segmento de datos, que es una parte de la pila demasiado:
int c[1000000] = {};
int main()
{
cout << "done\n";
return 0;
}
Este
asignará en algún lugar no especificado en el montón:
int main()
{
int* c = new int[1000000];
cout << "done\n";
return 0;
}
Gracias por la respuesta, pero podría explicarme por qué las matrices se asignan en la pila y por qué no en la memoria principal del programa. – Mayank
El código dado se asigna a la pila porque está especificado como una matriz con un número constante de elementos en tiempo de compilación. Los valores solo se ponen en el montón con malloc, nuevo, etc. –
Todos los varables automáticos se asignan en la pila. Si nos fijamos en lo que se puede descartar, verá el tamaño de las variables locales restadas del puntero de la pila.Cuando llama a malloc o calloc o cualquiera de las funciones de memoria, las funciones van y encuentran bloques de memoria lo suficientemente grandes como para satisfacer su pedido. – rerun