[C] Declaración estática de matriz tridimensional

Anteriormente he visto dudas de programación, así que expongo mi problema aquí:

Tengo un código como este:

 
#include <stdio.h>
#define N 1000
#define J 100
#define K 100

int main()
{
  //Declaración de variables:

  double dt = 0.1;
  double dx = 0.1;

  //Blablabla...

  double U[N][J][K];
  double V[N][J][K];

  //Ejecuta simulacion...
}


Compila bien, pero da un segmentation fault a la hora de declarar variables. El problema se elimina si rebajo las dimensiones de la matriz (es decir: N,J,K)

Brr... ¿Qué es lo que está fallando?
mmm.. sino me equivoco, al estar declarado dentro del main, la memoria se reserva en la pila, la cual esta limitada por el sistema operativo.

Con el comando ulimit puedes modificar el tamaño, en mi máquina
$ ulimit -s
8192

Como ves una cantidad bastante superior a la de por defecto. (mmm.. freo que la salida es en kB)

Solución A, modificar el valor de ulimit (ulimit -s tamaño) lo cual veo un poco feo [poraki]
Solución B, declarar la variable en el segmento de datos, esto es antes del main, tambien algo feo porque modificas la visibilidad de la variable (uff tengo c muy olvidado)
Solución C, declarar la variable como static (con sus consecuencias.. que tampoco las recuerdo muy bien, xd)
Solución C, usar memoria dinámica (malloc), no olvides de liberarla!

pd: he podido cometer unos cuantos errores, que tengo algo/bastante olvidado c
Básicamente es eso, cuando declaras una matriz estática, se intenta almacenar en la pila, que es limitada, y no cabe (además en las matrices estáticas, toda la matriz se almacena de forma consecutiva en memoria, a diferencia de hacerlo con malloc).

La solución más sencilla (y portable) es usar malloc.
Hmmm... pues vaya! Como mola EOL xD gracias!!

De todas formas, he modificado mi flujo de datos, y ahora no necesito una matriz descomunal.

Ahora... a ver si el programa hace lo que tiene que hacer ;)
3 respuestas