¿Por qué el siguiente código da como resultado un error de segmentación? (Estoy intentando crear dos matrices del mismo tamaño, uno con estática y el otro con la asignación dinámica)Asignación de memoria para una matriz en C
#include <stdio.h>
#include <stdlib.h>
//Segmentation fault!
int main(){
#define X 5000
#define Y 6000
int i;
int a[X][Y];
int** b = (int**) malloc(sizeof(int*) * X);
for(i=0; i<X; i++){
b[i] = malloc (sizeof(int) * Y);
}
}
Extrañamente, si comento hacia fuera una de las definiciones de la matriz, el código se ejecuta correctamente. De esta manera:
#include <stdio.h>
#include <stdlib.h>
//No Segmentation fault!
int main(){
#define X 5000
#define Y 6000
int i;
//int a[X][Y];
int** b = (int**) malloc(sizeof(int*) * X);
for(i=0; i<X; i++){
b[i] = malloc (sizeof(int) * Y);
}
}
o
#include <stdio.h>
#include <stdlib.h>
//No Segmentation fault!
int main(){
#define X 5000
#define Y 6000
int i;
int a[X][Y];
//int** b = (int**) malloc(sizeof(int*) * X);
//for(i=0; i<X; i++){
// b[i] = malloc (sizeof(int) * Y);
//}
}
estoy corriendo gcc en Linux en una máquina de 32 bits.
Editar: Verificando si malloc() tiene éxito:
#include <stdio.h>
#include <stdlib.h>
//No Segmentation fault!
int main(){
#define X 5000
#define Y 6000
int i;
int a[X][Y];
int* tmp;
int** b = (int**) malloc(sizeof(int*) * X);
if(!b){
printf("Error on first malloc.\n");
}
else{
for(i=0; i<X; i++){
tmp = malloc (sizeof(int) * Y);
if(tmp)
b[i] = tmp;
else{
printf("Error on second malloc, i=%d.\n", i);
return;
}
}
}
}
No se imprime nada cuando lo ejecuto (esperar, por supuesto, de "Fallo de segmentación")
Pruebe 'fprintf' a' stderr'. 'printf' se imprime a' stdout', que está almacenado en el búfer, por lo que si el programa falla, es probable que pierda el resultado. –
¿También puede imprimir i y ver qué tan avanzado está antes de fallar? –