打印矩阵内容时程序停止工作

时间:2014-03-04 22:40:36

标签: c

这是一个非常简单的程序。它读取一个大小为mn的矩阵,然后通常会向后打印偶数行和正常的偶数行,第0行是第1行,依此类推。由于某种原因,它只是停止工作。我希望有人可以指出我的错误,我已经尝试了很多解决方案,但它们似乎都没有。提前谢谢。

#include<stdio.h>
#include<stdlib.h>
int main(){
    int m,n,i,j;
    int **a;
    scanf("%d%d",&m,&n);
    fflush(stdin);
    a=(int**)malloc(sizeof(int*)*m);
    for(i=0;i<n;i++){
        a[i]=(int*)malloc(sizeof(int)*n);
                    }
    for(i=0;i<m;i++){
        for(j=0;j<n;j++){
            scanf("%d",&a[i][j]);
            fflush(stdin);
        }
    }
    for(i=0;i<m;i++){
        if((m+1)%2==0){
            for(j=0;j<n;j++){
            printf("%d ",a[i][j]);
            }
        }
        else{
            for(j=n;j!=0;j--){
            printf("%d ",a[i][j]);
        }
        }
        printf("\n");
    }
    return 0;
}

2 个答案:

答案 0 :(得分:0)

for(i=0;i<m;i++){ // <==
    a[i]=(int*)malloc(sizeof(int)*n);
                }

您必须分配总共m个数组,而不是n

然后调整

for(j=n-1;j>=0;j--){

j必须保持在0n-1

之间

修改

这里有另一个错误:

    if((m+1)%2==0){  // <-- wrong

正确

    if((i+1)%2==0){

如果计算行,假设第一个是奇数(nr.1),那么即使是行(那些将被正常打印的行)也会产生真值


顺便说一下:

1)您应该熟悉调试器的使用。你会立即发现这些错误。 (并且你不应该使用Stack Overflow作为“请调试我的代码服务”。但我很乐意提供帮助..)

2)你不应该转换malloc的返回值,例如

a[i]=malloc(sizeof(int)*n);

3)你应该在程序结束时释放分配的内存:

    free(a);  // <-----
    return 0;
}

答案 1 :(得分:0)

正如Paolo所说,您正在分配总共n个数组,但您需要分配m。在代码的第9行,这是:

for(i=0;i<n;i++){

必须从0m而不是n

加上Paolo提到的另一个调整,一个与j的值相关的调整。

我认为您使用m哪个值永远不会更改,因此您的“偶数与否”验证可能会遇到问题,使用i即可。