【问题标题】:Load value from file to a value of 2D array pointer将值从文件加载到二维数组指针的值
【发布时间】:2016-04-05 23:48:56
【问题描述】:

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

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", &amp;matice[c][d]) 对吗?

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

【问题讨论】:

  • matice 是什么?你的意思是matrix
  • @johnbollinger 是的,对不起,我的错,打错了。现在已经修改了。

标签: c multidimensional-array malloc


【解决方案1】:

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

你至少有两个问题:

  1. 根据您的分配策略,数组的第一个索引从0n - 1,指向数组的索引从0m - 1。如果nm 不同,则在读取循环中反转它,从而超出至少一个数组的边界。

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

【讨论】:

  • 1.我的注意力不集中,谢谢 2。这正是我需要知道的!谢谢!
【解决方案2】:

试试这个

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

【讨论】:

  • 我有这样的,但它打破了“免费(第一[1])”:(
  • @Lucfia 在你的情况下,这是提前执行free(matrix); 的一个不好的理由。
  • first 是拼写错误matrix :D
【解决方案3】:

应该是:

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

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

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

尚不清楚 matrixmain() 中的用途 - 摆脱它(当然不要 free 它,因为你从来没有把它指向任何地方)。

【讨论】:

    猜你喜欢
    • 2016-04-19
    • 1970-01-01
    • 2012-05-09
    • 1970-01-01
    • 2013-03-03
    • 1970-01-01
    • 2019-05-05
    • 1970-01-01
    • 2013-02-13
    相关资源
    最近更新 更多