将文件中的值加载到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] ,这根本不是一回事as &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);

目前尚不清楚main() matrix是什么 – 摆脱它(当然不要free它,因为你从来没有把它指向任何地方)。