que pila direcciones c arrays memory stack allocation

direcciones - Obteniendo una excepción de desbordamiento de pila al declarar una matriz grande



que es heap (9)

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

Si haces eso, y aún rompes la pila, 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 programa no puede asignarlo en el montón, su programa realmente no tiene nada que ver con ese tipo de máquina para empezar.

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

El siguiente código está generando un error de desbordamiento de pila 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 pila de permitirme declarar el tamaño usando una variable.


Como Turbo C / C ++ es un compilador 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 pila y causaron el desbordamiento de la memoria de la pila. 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.


Eso es aproximadamente 7MB de espacio de pila. En Visual Studio usaría / STACK: ###, ### para reflejar el tamaño que desea. Si realmente quieres una gran pila (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 compilar con / LARGEADDRESSAAWARE (el enlazador de Visual Studio nuevamente), pero este configura su encabezado PE para permitir que su binario compilado 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 #pgrama.


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 programa).
  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 declaración 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 pila. algo como

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


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

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

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

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


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 pila (por lo tanto, no se obtendrá un desbordamiento de la pila).

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)


Use malloc lugar. Sintaxis:

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


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.