如何在另一个函数中将文件中的值正确加载到矩阵中?
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]
正常。我不确定我做错了什么。
答案 0 :(得分:2)
您有一个指针数组,每个元素都设置为指向动态分配的块。这是不 2D数组,但您可以通过与2D数组相同的语法索引整个数据结构。
你至少有两个问题:
根据您的分配策略,数组的第一个索引从0
运行到n - 1
,而指向数组的索引从0
运行到{{ 1}}。您在读取循环中将其反转,从而在m - 1
和n
不同时超出至少一个数组的范围。
更重要的是,传递给m
的存储指针是错误的。在fscanf()
中,变量someFunction()
的类型为matrix
,您传递了int **的地址。因此,索引[int ***
] [c
]的元素为d
,该元素的地址为(*matrix)[c][d]
,与{&(*matrix)[c][d]
完全不同。 1}},甚至与&matrix[c][d]
相同。
答案 1 :(得分:-1)
试试这个
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);
}
答案 2 :(得分:-1)
应该是:
void someFunction(int **matrix, n, m)
// ^^^^
你有太多的明星了。因此,您尝试扫描指针,而不是扫描到int,导致内存损坏。
电话会是someFunction(first, n, m);
。
我不清楚matrix
中的main()
是什么 - 摆脱它(当然不要free
因为你从来没有把它指向任何地方)。