爲什麼下面的代碼導致分段錯誤? (我試圖創建一個同樣大小的兩個矩陣,一個靜態和其他與動態分配)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);
}
}
古怪的是,如果我註釋掉矩陣定義之一,代碼運行正常。就像這樣:
#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);
}
}
或
#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);
//}
}
我是一個32位的機器上運行GCC在Linux上。
編輯:檢查是否的malloc()成功:
#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;
}
}
}
}
什麼也沒有打印出來,當我運行它(當然期待爲 「段錯誤」)
嘗試'fprintf'到'stderr'。 'printf'打印到'stdout',它被緩衝,所以如果程序崩潰了,你可能會失去輸出。 – 2010-04-15 15:50:14
你還可以打印出我看看在失敗之前進入循環多遠? – 2010-04-15 15:56:45