Cómo superar el problema del tamaño de stack con Visual Studio (ejecutando códigos C con gran matriz)

Estoy usando Visual Studio 13 para comstackr códigos c por primera vez. Los códigos funcionan perfectamente bien con 2d arays de tamaño 64 * 64 (hay algunas matrices en mi progtwig) pero si aumento el tamaño de la matriz a 128 * 128, no se ejecuta (pero se comstack correctamente). En su lugar, da un mensaje “.exe ha dejado de funcionar”. Mi máquina tiene 4 GB de memoria RAM y el mismo progtwig se ejecuta con matriz 128 * 128 si ejecuto los códigos desde Linux.

Permítanme proporcionar algunos más detalles: he ejecutado el mismo código de Linux utilizando el comstackdor Intel C (versión no comercial) en la misma máquina. Pero debido a algún problema ahora estoy obligado a trabajar desde un entorno Windows. Busqué e instalé dos comstackdores c (1) Visual Studio 13 y (2) Borland C. Ambos funcionan bien con una pequeña matriz. Pero en el momento en que aumento el tamaño de la matriz, Visual Studio da el mensaje “.exe ha dejado de funcionar”. Compilo el progtwig usando ‘cl’ de “Developers Command Prompt VS 13”.

Siento que el problema es con el tamaño de la stack.

En la explicación detallada del enlace (como se muestra a continuación), he visto un comando “ulimit” utilizado en el entorno de Linux para boost el tamaño de la stack. Recuerdo haberlo usado hace unos años.

Siento que estamos cerca de la solución, pero mi problema con Windows (y VS 2013) persiste ya que no dumpbin /headers executable_file ejecutar dumpbin /headers executable_file o editbin /STACK:size . En realidad, siento que no sé cómo ejecutarlos. Intenté ejecutarlos desde “Developer Command Prompt VS 13” y también con Run (windows start bottom-> search (run) -> Run (apuntalar)). Le solicito cordialmente que proporcione más detalles si es posible.

Busqué y encontré este sitio web y creo que aquí se puede encontrar la solución.

Por favor ayuda. Quiero ejecutar usando Visual Studio 13 desde Windows.

Parece que la razón detrás de esto es el desbordamiento de la stack. El problema se puede resolver aumentando el tamaño de la stack.
En Visual Studio puedes hacer esto usando /STACK:reserve[,commit] . Lea el artículo de MSDN .


Para una explicación más detallada :

En las plataformas de Windows, la información del tamaño de la stack está contenida en los archivos ejecutables. Se puede establecer durante la comstackción en Visual Studio C ++.
Alternativamente, Microsoft proporciona un progtwig editbin.exe que puede cambiar los archivos ejecutables directamente. Aquí hay más detalles:

Windows (durante la comstackción):

  1. Seleccione Project->Setting .
  2. Seleccionar página de Link .
  3. Seleccione Category to Output .
  4. Escriba su tamaño de stack preferido en el campo Reserve: en Stack allocations . por ejemplo, 32768 en decimal o 0x20000 en hexadecimal.

Windows (para modificar el archivo ejecutable):

Hay dos progtwigs incluidos en Microsoft Visual Studio, dumpbin.exe y editbin.exe . Ejecute dumpbin /headers executable_file , y puede ver el size of stack reserve información de size of stack reserve en optional header values . Ejecute editbin /STACK:size para cambiar el tamaño predeterminado de la stack.

Visual Studio no funciona?

Aunque no considero VS como una herramienta de desarrollo válida, dudo mucho que pueda causar su problema.

128 * 128 es 16384. Si tiene muy poco espacio en la stack (en Windows, es 1MB por defecto si no me equivoco), y define una matriz de, por ejemplo, struct suficientemente grandes (tamaño 64 bytes, más precisamente), entonces esto puede causar fácilmente un desbordamiento de la stack, ya que las matrices automáticas son típicamente (aunque no necesariamente) asignadas en la stack.

Parece que intentas declarar grandes matrices en la stack. La memoria de stack suele ser limitada; parece que lo estás desbordando.

Puede solucionar esto dando la duración estática de su matriz

 static BigStruct arr[128][128]; 

o asignando dinámicamente memoria para ello

 BigStruct (*arr)[128] = malloc(sizeof(*arr) * 128); // use arr free(arr);