我正在从文件中读取矩阵并具有以下代码:
int **mat;
int main(void) {
FILE *fp;
if((fp = fopen("matrix.txt", "r")) == NULL){
printf("Cannot open file \n");
exit(1);
getch();
}
fscanf(fp, "%d", &N); //size of matrix NxN
mat = (int**)malloc(N * sizeof(int*));
for(i = 1; i <= N; i++){
mat[i] = (int*)malloc(N * sizeof(int));
for(j = 1; j <= N; j++)
fscanf(fp, "%1d", &mat[i][j]);
}
fclose(fp);
你能告诉我它有什么问题吗?
答案 0 :(得分:3)
不多......
free
的一些电话。每次拨打malloc
都应该对free
进行相应的调用。getch()
之后对exit
的调用是多余的。main
通常定义为int main(int argc, char **argv)
main
答案 1 :(得分:1)
对于大型数组,此代码的内存效率不如预期。你可以使用一个大小为N * N * sizeof(int)的malloc。然后,您将其编入索引为数组[N * row + col]。如果这个符号太难看了,你可以通过一个宏来涂上一些语法糖。
此外,其他人都说。 :)
答案 2 :(得分:0)
更改为for (i = 1; i < N; i++) { ...
和for (j = 0; j < N; j++) { ...
,因为C使用基于0的索引。一世。即数组A的第一个元素是A [0](不是A [1])
答案 3 :(得分:0)
包含<stdlib.h>
- 因此您无需转发malloc(3)
的回复,这可能会掩盖其他问题。
for(i=1;i<=N;i++){
mat[i] = (int*)malloc(N*sizeof(int));
for(j=1;j<=N;j++)
fscanf(fp, "%1d", &mat[i][j]);
}
您已经破坏了数组索引 - 在C中,数组的索引从0
到N-1
,而不是1
到N
。