C语言segmentation fault?

#include
main(){
int M, N, T, S[M][N], B;
scanf("%d%d%d", &M, &N, &T);
int i, j;
for (i=0;i<M;i++){
for (j=0;j<N;j++){
scanf("%d",&S[i][j]);
};
};
if (T == 0){
for (i=0;i<M;i++){
for (j=0;j<N;j++){
B = S[i][M-1-j];
S[i][M-1-j]=S[i][j];
S[i][j] = B;
printf("%d", S[i][M-1-j]);
};
printf("\n");
};
};
if (T == 1){
for (i=0;i<M;i++){
for (j=0;j<N;j++){
B = S[N-1-i][j];
S[N-1-i][j]=S[i][j];
S[i][j] = B;
printf("%d", S[N-1-i][j]);
};
printf("\n");
};
};
}

segmentation fault一般都是指针方面的原因,自己调试下。

  • int M, N, T, S[M][N], B;
  • c语言的数组不是动态的,因此你在M,N都还没有值的时候就创建数组S[M][N]是不对的,Segament Fault也是因为这个原因。
  • 正确的做法1:假设一个最大值,并且在输入M,N的时候判断,不得超过此最大值。数组预先用最大值创建。
  • 将S转化为一个**int,在M,N有值以后,动态申请内存单元。

int M, N, T, S[M][N], B;
这里数组的维数M和N必须是常熟,要么是你new动态分配。

int M, N, T, S[M][N], B;

S[M][N]这个数组你是想放在栈上,还是放在堆上?放在堆上要动态分配,放在栈上不能给下标变量,因为那样就动态分配了。