为什么下面的代码导致分段错误? (我试图创建一个同样大小的两个矩阵,一个静态和其他与动态分配)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