【问题标题】:How does **matrix work differently from matrix[rows][columns]?**matrix 与 matrix[rows][columns] 的工作方式有何不同?
【发布时间】:2017-05-05 20:02:58
【问题描述】:

我在学习的时候正在做一些事情,我遇到了下一个问题。 为了简化和缩短问题,我将代码完全简化为问题。

我想读取一个矩阵并将其输出到我的屏幕上。 但是当我运行这段代码时:

int main(){
    int in, jn, row, col, **mat;
    scanf("%d %d", &row, &col);
    mat = (int **) malloc(row * col * sizeof(int *));
    for(in = 0; in < col; in++){
        mat[in] = (int *) malloc((col + 1) * sizeof(int));
    }
    if(mat == NULL){
        printf("Error. Allocation was unsuccessful. \n");
        return 1;
    }
    for(in = 0; in < row; in++){
        for(jn = 0; jn < col; jn++){
            scanf("%d", &mat[in][jn]);
        }
    }
    for(in = 0; in < row; in++){
        for(jn = 0; jn < col; jn++){
            printf("%d ", mat[in][jn]);
        }
        printf("\n");
    }
    return 0;
}

我得到分段错误。我调试了程序,当 in = 2 和 jn = 0 时出现错误。所以我读到: 1 2 3 4 在这里我得到分段错误,当试图读入 mat [2] [0] 时。我不明白为什么。 The error

我这里有另一个版本:

int main(){
    int in, jn, row, col;
    scanf("%d %d", &row, &col);
    int mat[row][col];
    for(in = 0; in < row; in++){
        for(jn = 0; jn < col; jn++){
            scanf("%d", &mat[in][jn]);
        }
    }
    for(in = 0; in < row; in++){
        for(jn = 0; jn < col; jn++){
            printf("%d ", mat[in][jn]);
        }
        printf("\n");
    }
    return 0;
}

这个问题是我在代码块中看不到手表中的值。对于 mat[0][0](例如)而不是矩阵的第一个元素,我看到这个“无法对不完整类型执行指针数学,尝试转换为已知类型或 void *。”

对我来说,这是一种奇怪的行为,我不明白。 为什么我在第一个版本中出现分段错误,为什么我在手表窗口中看不到矩阵?

【问题讨论】:

标签: c matrix dynamic


【解决方案1】:

类型 (*int) 的内存分配量已关闭。 您所需要的只是行数。 对于每一行,只需要类型 (int) 的列数。 这是指向数组和指针之间差异的链接。 link

 #include <stdio.h>
 #include <stdlib.h>
 #include <assert.h>

 int main(){
    int in, jn, row, col, **mat;
    scanf("%d %d", &row, &col);
    mat = malloc(row * sizeof(int *));
    if(mat == NULL){
       printf("Error. Allocation was unsuccessful. \n");
       return 1;
     }
     for(in = 0; in < row; in++){
        mat[in] = malloc(col * sizeof(int));
        assert(mat[in]!=NULL);
     }
     for(in = 0; in < row; in++){
       for(jn = 0; jn < col; jn++){
          scanf("%d", &mat[in][jn]);
       }
     }
     for(in = 0; in < row; in++){
        for(jn = 0; jn < col; jn++){
           printf("%d ", mat[in][jn]);
        }
        printf("\n");
     }
    return 0;
 }

【讨论】:

  • 不行,请再看mat[in] = (int *) malloc((row) * sizeof(int));
  • 感谢您的链接
  • @Nguaial 应该有 mat[in] = (int *) malloc(col * sizeof(int));
  • 我的错。我修改了它。
猜你喜欢
  • 1970-01-01
  • 2011-04-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-07-23
  • 2021-02-26
  • 2023-04-07
相关资源
最近更新 更多