如何在另一个函数中将值从文件正确加载到矩阵?
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]
,这与&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);
。
目前还不清楚matrix
在main()
中的作用——去掉它(当然也不要free
,因为你从来没有在任何地方指出过它)。