Obteniendo una excepción de desbordamiento de stack al declarar una matriz grande

El siguiente código está generando un error de desbordamiento de stack para mí

int main(int argc, char* argv[]) { int sieve[2000000]; return 0; } 

¿Cómo puedo evitar esto? Estoy usando Turbo C ++ pero me gustaría mantener mi código en C

EDITAR:

Gracias por el consejo. El código de arriba fue solo por ejemplo, de hecho declaro la matriz en una función y no en sub-principal. Además, necesitaba que la matriz se inicializara en ceros, así que cuando busqué en Google malloc, descubrí que calloc era perfecto para mis propósitos.

Malloc / calloc también tiene la ventaja sobre la asignación en la stack de permitirme declarar el tamaño usando una variable.

Su matriz es demasiado grande para caber en la stack, considere usar el montón:

 int *sieve = malloc(2000000 * sizeof(*sieve)); 

Si realmente desea cambiar el tamaño de la stack, eche un vistazo a este documento.

Consejo : – No olvide liberar su memoria asignada dinámicamente cuando ya no la necesite.

Hay 3 formas:

  1. Asigne la matriz en el montón: utilice malloc() , como sugieren otros carteles. No se olvide de free() (aunque para main() no es tan importante: el sistema operativo limpiará la memoria cuando termine el progtwig).
  2. Declare la matriz en el nivel de la unidad: se asignará en el segmento de datos y será visible para todos (agregar static a la statement limitará la visibilidad a la unidad).
  3. Declare su matriz como static ; en este caso, se asignará en el segmento de datos, pero solo será visible en main() .

Sería mejor que lo asignaras al montón, no a la stack. algo como

 int main(int argc, char* argv[]) { int * sieve; sieve = malloc(20000); return 0; } 

Eso es aproximadamente 7MB de espacio de stack. En Visual Studio usaría / STACK: ###, ### para reflejar el tamaño que desea. Si realmente quieres una gran stack (podría ser una buena razón, usando LISP o algo así :), incluso el montón está limitado a pequeñas asignaciones antes de forzarte a usar VirtualAlloc), también puedes configurar tu PE para comstackr con / LARGEADDRESSAAWARE (el enlazador de Visual Studio nuevamente), pero este configura su encabezado PE para permitir que su binario comstackdo abarque todos los 4 GB de espacio de direcciones de 32 bits (si se ejecuta en un WOW64). Si construyes binarios verdaderamente masivos, también necesitarías configurar / bigobj como un parámetro de enlazador adicional.

Y si aún necesita más espacio, puede violar radicalmente las convenciones usando algo similar a (nuevamente el enlace de MSVC) / merge :, que le permitirá empacar una sección en otra, para que pueda usar cada byte individual para un solo código compartido / sección de datos. Naturalmente, también necesitaría configurar los permisos SECTIONS en un archivo def o con #pgtwig.

Use malloc. Todos comprueban que el tipo de retorno no es nulo, si es nulo, entonces su sistema simplemente no tiene suficiente memoria para ajustarse a esos muchos valores.

¿Hay algún motivo por el que no pueda usar alloca () para asignar el espacio que necesita en el marco de la stack en función de qué tan grande debe ser realmente el objeto?

Si haces eso, y aún rompes la stack, ponla en el montón asignado. Recomiendo NO declararlo como estático en main () y colocarlo en el segmento de datos.

Si realmente tiene que ser tan grande y su progtwig no puede asignarlo en el montón, su progtwig realmente no tiene nada que ver con ese tipo de máquina para empezar.

¿Qué (exactamente) estás tratando de lograr?

Tu arreglo es enorme

Es posible que su máquina o sistema operativo no tenga o quiera asignar tanta memoria.


Si realmente necesita una matriz enorme, puede intentar asignarla dinámicamente (utilizando malloc(...) ), pero corre el riesgo de perder memoria. No te olvides de liberar la memoria.

La ventaja de malloc es que intenta asignar memoria en el montón en lugar de la stack (por lo tanto, no se obtendrá un desbordamiento de la stack).

Puede verificar el valor que malloc devuelve para ver si la asignación tuvo éxito o falló. Si falla, intenta malloc una matriz más pequeña.


Otra opción sería usar una estructura de datos diferente que se pueda redimensionar sobre la marcha (como una lista vinculada). Si esta opción es buena depende de lo que va a hacer con los datos.

Otra opción más sería almacenar cosas en un archivo, transmitir datos sobre la marcha. Este enfoque es el más lento.

Si va a almacenar en el disco duro, también puede usar una biblioteca existente (para bases de datos)

Como Turbo C / C ++ es un comstackdor de 16 bits, el tipo de datos int consume aproximadamente 2 bytes. 2bytes * 2000000 = 40,00,000 bytes = 3,8147MB de espacio.

Las variables automáticas de una función se almacenan en la stack y causaron el desbordamiento de la memoria de la stack. En su lugar, utilice la memoria de datos [utilizando la variable estática o global] o la memoria dinámica del montón [utilizando el malloc / calloc] para crear la memoria requerida según la disponibilidad de la asignación de la memoria del procesador.

Use malloc lugar. Sintaxis:

 newnode=(struct node *)malloc(sizeof(struct node))