Dlaczego następujący kod powoduje błąd segmentacji? (Próbuję utworzyć dwie matryce o tej samej wielkości, jeden z statyczna i inne z dynamicznej alokacji)Alokacja pamięci dla macierzy w 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);
}
}
wystarczająco Niesamowicie, jeśli I ustosunkowania się jedną z definicji macierzy, kod działa poprawnie. Tak:
#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);
}
}
lub
#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);
//}
}
biegnę gcc w systemie Linux na komputerze 32-bitowym.
Edit: sprawdzenie czy malloc() powiedzie:
#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;
}
}
}
}
Nic nie jest drukowany, gdy uruchomię go (oczywiście oczekiwać dla "winy segmentacji")
Wypróbuj 'fprintf' na' stderr'. 'printf' drukuje na' stdout', który jest buforowany, więc jeśli program się zawiesza, prawdopodobnie stracisz wydruk. –
Czy możesz również wydrukować i zobaczyć, jak daleko w pętli dostaje się przed niepowodzeniem? –