使用malloc有什么问题?

时间:2011-11-21 00:47:59

标签: c memory-management 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);

你能告诉我它有什么问题吗?

4 个答案:

答案 0 :(得分:3)

不多......

  1. 您错过了对free的一些电话。每次拨打malloc都应该对free进行相应的调用。
  2. 数组指示从零开始,而不是一个
  3. getch()之后对exit的调用是多余的。
  4. main通常定义为int main(int argc, char **argv)
  5. 您错过了main
  6. 的返回值

答案 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中,数组的索引从0N-1,而不是1N