2011-11-21 65 views
-2

我从文件中读取一个矩阵,有下面的代码:使用malloc有什么问题?

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

我们当然不能因为你没有提供任何错误信息。 – halfdan

+0

演员。不要投。 (也是索引。) –

+1

很多东西。首先,C中的数组索引从'0'到'N-1',而不是从'1'到'N'。 – Marlon

回答

3

不多......

  1. 你缺少free打了几个电话。每拨打malloc应拨打电话free
  2. 阵列标记从零开始并且不是一个
  3. exit之后呼叫getch()是多余的。
  4. main通常被定义为int main(int argc, char **argv)
  5. 您从main
0

更改为for (i = 1; i < N; i++) { ...for (j = 0; j < N; j++) { ...,因为C使用基于0的索引。一世。即数组A的第一个元素是A [0](而不是A [1])

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,数组索引是从0N-1,不1N

1

对于大型阵列缺少一个返回值,这个代码是没有记忆效率,因为它可以。你可以用一个大小为N * N * sizeof(int)的malloc逃脱。然后你可以将其索引为数组[N * row + col]。如果这个符号太丑陋了,你可以通过一个宏来涂上一些语法糖。

另外,其他人都说。 :)