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



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

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]工作正常。我不确定我做错了什么。

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

你至少有两个问题:

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

  2. 更重要的是,您传递给fscanf()的存储指针是错误的。在someFunction()中,变量matrix的类型为int ***,您可以传递一个int**的地址。因此,索引[c][d]处的元素是(*matrix)[c][d],并且该元素的地址是&(*matrix)[c][d],这与&matrix[c][d]根本不相同,甚至与matrix[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, n, m)
//                   ^^^^

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

呼叫将是someFunction(first, n, m);

目前还不清楚matrixmain()中的作用——去掉它(当然也不要free,因为你从来没有在任何地方指出过它)。

相关内容

  • 没有找到相关文章

最新更新