Fallo de segmentación en scanf

Mientras ejecuto este código, encuentro un error de segmentación en scanf (). Esto posiblemente se deba a la statement de arreglos grandes (lo verifiqué comentando la statement de arreglos).

#include int main() { int test; //int n,ok,counter,i,j; char a[1000][1000]; int x[1000][1000],y[1000][1000]; scanf("%d",&test); printf("%d",test); return 0; } 

Ya que necesito esos arreglos, ¿puede alguien sugerirme cómo corregir este código?

El problema es que estás definiendo algunos objetos enormes localmente. Las variables locales se crean en la stack y la stack tiene límites (por hilo). A veces la stack puede tener un máximo de 1 megabyte. Tus arreglos estarían mucho más allá de eso. Supongo que en realidad estás desbordando la stack. Podría mover las definiciones de matriz fuera de main y su progtwig debería funcionar, ya que esas matrices no se crearían en la stack. También puedes definir tus arreglos haciéndolos static en main . Esto tiene el mismo efecto que declararlos afuera.

Las variables definidas globalmente (incluidas las matrices no inicializadas) y las variables static no inicializadas (incluso si están en una función) generalmente se colocan en un segmento de datos y se inicializan cuando se ejecuta su progtwig. También se garantiza que estén configurados en el 0. Esta referencia de Wiki describe esta área de datos en C como:

BSS en C

En C, los objetos asignados estáticamente sin un inicializador explícito se inicializan a cero (para tipos aritméticos) o un puntero nulo (para tipos de punteros). Las implementaciones de C normalmente representan valores cero y valores de puntero nulo utilizando un patrón de bits que consiste únicamente en bits de valor cero (aunque esto no es requerido por el estándar C). Por lo tanto, la sección de BSS generalmente incluye todas las variables no inicializadas declaradas en el scope del archivo (es decir, fuera de cualquier función), así como las variables locales no inicializadas declaradas con la palabra clave estática. Una implementación también puede asignar variables asignadas estáticamente inicializadas con un valor que consiste únicamente en bits de valor cero a la sección bss.

El segmento BSS no está restringido como lo está la stack. BSS podría utilizar hasta la memoria disponible si los recursos existen y usted no excede ninguna cuota de proceso.

Otra alternativa es asignar dinámicamente los arreglos usando malloc que los pondría en el montón. El siguiente código sería la forma más fácil de crear sus arreglos. Utilicé #define para aclarar qué es una fila y una columna. Después de definir estos arreglos y asignarles memoria, se pueden usar como cualquier arreglo 2D normal.

 #include #include int main() { #define ROWS 1000 #define COLUMNS 1000 int test; char (*a)[COLUMNS] = malloc(ROWS * sizeof *a); int (*x)[COLUMNS] = malloc(ROWS * sizeof *x); int (*y)[COLUMNS] = malloc(ROWS * sizeof *y); a[100][20] = 'X'; x[4][999] = 666; y[500][0] = 42; scanf("%d",&test); printf("%d",test); free(a); free(x); free(y); return 0; } 

¡Está asignando una gran cantidad de memoria en la stack y eso está provocando el flujo de stack ! Debería usar malloc() para tales casos, se asignará la memoria en el montón. También es necesario free() la memoria después del uso.

Este es un código de muestra que puedes usar, solo lo he hecho para a variable, puedes usar un código similar para tus variables x e y :

 #include #include int main() { char **a; int i, j; a = malloc(1000*sizeof(char*)); for(i=0;i<1000;i++) { a[i] = malloc(1000*sizeof(char)); for(j = 0; j < 1000; j++) { //Your operations } } for(i=0; i< 1000; i++) free( a[i]); free(a); return 0; }