C 将值从文件加载到2D数组指针的值

C 将值从文件加载到2D数组指针的值,c,multidimensional-array,malloc,C,Multidimensional Array,Malloc,如何正确地将值从文件加载到另一个函数中的矩阵 void someFunction(int ***matrix, n, m) { int c, d; FILE *fp = fopen("some.txt", "r"); // načtení souboru for (c = 0; c < m; c++) { for (d = 0; d < n; d++) { fscanf(fp, "%i", &matrix[c][

如何正确地将值从文件加载到另一个函数中的矩阵

void someFunction(int ***matrix, n, m) {
    int c, d;
    FILE *fp = fopen("some.txt", "r"); // načtení souboru
    for (c = 0; c < m; c++) {
        for (d = 0; d < n; d++) {
            fscanf(fp, "%i", &matrix[c][d]); //4th read throws error
        }
    }
}

int main() {
    int i;
    int **matrix;
    int n = 3; // columns
    int m = 2; // rows

    first = (int **)malloc(n * sizeof(int*));
    for (i = 0; i < n; i++)
        first[i] = (int *)malloc(m * sizeof(int));

    someFunction(&matrix, n, m);

    free(matrix);
    for (i = 0; i < n; i++)
        free(first[i]);
}
void someFunction(int***矩阵,n,m){
int c,d;
FILE*fp=fopen(“some.txt”,“r”);//načtenísouboru
对于(c=0;c
fscanf(fp、%i、&matice[c][d])
对吗


它在
[1][0]
处失败(内存错误),但
[0][0]、[0][1]、[0][2]
工作正常。我不确定我做错了什么。

您有一个指针数组,每个元素都被设置为指向一个动态分配的块。这不是一个二维数组,尽管您可以通过与二维数组相同的语法索引到整个数据结构中

您至少有两个问题:

  • 根据分配策略,数组的第一个索引从
    0
    运行到
    n-1
    ,指向数组的索引从
    0
    运行到
    m-1
    。如果
    n
    m
    不同,则在读取循环中反转该值,从而超出至少一个数组的界限

  • 更重要的是,传递给
    fscanf()
    的存储指针错误。在
    someFunction()
    中,变量
    matrix
    的类型为
    int***
    ,并且您传递int**的地址。因此,索引[
    c
    ][
    d
    ]处的元素是
    (*矩阵)[c][d]
    ,该元素的地址是
    &(*矩阵)[c][d]
    ,这与
    &矩阵[c][d]
    完全不同,甚至与
    矩阵[c][d]
    也不相同


  • 您有一个指针数组,每个元素都被设置为指向一个动态分配的块。这不是一个二维数组,尽管您可以通过与二维数组相同的语法索引到整个数据结构中

    您至少有两个问题:

  • 根据分配策略,数组的第一个索引从
    0
    运行到
    n-1
    ,指向数组的索引从
    0
    运行到
    m-1
    。如果
    n
    m
    不同,则在读取循环中反转该值,从而超出至少一个数组的界限

  • 更重要的是,传递给
    fscanf()
    的存储指针错误。在
    someFunction()
    中,变量
    matrix
    的类型为
    int***
    ,并且您传递int**的地址。因此,索引[
    c
    ][
    d
    ]处的元素是
    (*矩阵)[c][d]
    ,该元素的地址是
    &(*矩阵)[c][d]
    ,这与
    &矩阵[c][d]
    完全不同,甚至与
    矩阵[c][d]
    也不相同

  • 试试这个

    void someFunction(int **matrix, int n, int m) {
        int c, d;
        FILE *fp = fopen("some.txt", "r");
        for (c = 0; c < n; c++) {
            for (d = 0; d < m; d++) {
                fscanf(fp, "%i", &matrix[c][d]);
            }
        }
        fclose(fp);
    }
    
    int main(void) {
        int i;
        int **matrix;
        int n = 3; // rows
        int m = 2; // columns
    
        matrix = (int **)malloc(n * sizeof(int*));
        for (i = 0; i < n; i++)
            matrix[i] = (int *)malloc(m * sizeof(int));
    
        someFunction(matrix, n, m);
    
        for (i = 0; i < n; i++)
            free(matrix[i]);
        free(matrix);
    }
    
    void someFunction(int**matrix,int n,int m){
    int c,d;
    FILE*fp=fopen(“some.txt”、“r”);
    对于(c=0;c
    试试这个

    void someFunction(int **matrix, int n, int m) {
        int c, d;
        FILE *fp = fopen("some.txt", "r");
        for (c = 0; c < n; c++) {
            for (d = 0; d < m; d++) {
                fscanf(fp, "%i", &matrix[c][d]);
            }
        }
        fclose(fp);
    }
    
    int main(void) {
        int i;
        int **matrix;
        int n = 3; // rows
        int m = 2; // columns
    
        matrix = (int **)malloc(n * sizeof(int*));
        for (i = 0; i < n; i++)
            matrix[i] = (int *)malloc(m * sizeof(int));
    
        someFunction(matrix, n, m);
    
        for (i = 0; i < n; i++)
            free(matrix[i]);
        free(matrix);
    }
    
    void someFunction(int**matrix,int n,int m){
    int c,d;
    FILE*fp=fopen(“some.txt”、“r”);
    对于(c=0;c
    它应该是:

    void someFunction(int **matrix, n, m)
    //                   ^^^^
    
    你的星星太多了。因此,您试图扫描指针,而不是扫描int,从而导致内存损坏

    调用将是
    someFunction(first,n,m)

    不清楚矩阵在
    main()
    中的作用是什么-扔掉它(当然也不要
    释放它,因为你从未在任何地方指出它)。

    它应该是:

    void someFunction(int **matrix, n, m)
    //                   ^^^^
    
    你的星星太多了。因此,您试图扫描指针,而不是扫描int,从而导致内存损坏

    调用将是
    someFunction(first,n,m)


    不清楚
    main()
    中的
    matrix
    是做什么的-扔掉它(当然不要
    释放它,因为你从来没有指出它的意义)。

    什么是
    matice
    ?你是说矩阵?@johnbollinger是的,对不起,是我的错,打错了。现在修订了。什么是
    matice
    ?你是说矩阵?@johnbollinger是的,对不起,是我的错,打错了。现在修订了。我的疏忽,谢谢你。这正是我需要知道的!非常感谢。1.我的疏忽,谢谢你。这正是我需要知道的!非常感谢。我是这样做的,但它在“free(first[1])”时中断:(@Lucfia在你的情况下,这是执行
    free(matrix);
    的一个不好的理由。
    first
    是拼写错误,因为
    matrix
    :我是这样做的,但在“free(first[1])”时中断:(@Lucfia在你的情况下,这是执行
    free(matrix)的一个不好的理由)前面。
    先<