将文件中的值加载到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数组相同的语法索引整个数据结构。
你至少有两个问题:
-
根据您的分配策略,数组的第一个索引从
0
到n - 1
,指向数组的索引从0
到m - 1
。 如果n
和m
不同,则在读取循环中将其反转,从而超出至少一个数组的范围。 -
更重要的是,传递给
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
它,因为你从来没有把它指向任何地方)。