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

时间:2016-04-05 23:48:56

标签: 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][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]);
}

fscanf(fp, "%i", &matice[c][d])是对吗?

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

3 个答案:

答案 0 :(得分:2)

您有一个指针数组,每个元素都设置为指向动态分配的块。这是 2D数组,但您可以通过与2D数组相同的语法索引整个数据结构。

你至少有两个问题:

  1. 根据您的分配策略,数组的第一个索引从0运行到n - 1,而指向数组的索引从0运行到{{ 1}}。您在读取循环中将其反转,从而在m - 1n不同时超出至少一个数组的范围。

  2. 更重要的是,传递给m的存储指针是错误的。在fscanf()中,变量someFunction()的类型为matrix,您传递了int **的地址。因此,索引[int ***] [c]的元素为d,该元素的地址为(*matrix)[c][d],与{&(*matrix)[c][d]完全不同。 1}},甚至与&matrix[c][d]相同。

答案 1 :(得分:-1)

试试这个

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);
}

答案 2 :(得分:-1)

应该是:

void someFunction(int **matrix, n, m)
//                   ^^^^

你有太多的明星了。因此,您尝试扫描指针,而不是扫描到int,导致内存损坏。

电话会是someFunction(first, n, m);

我不清楚matrix中的main()是什么 - 摆脱它(当然不要free因为你从来没有把它指向任何地方)。