C - 当我从文件中读取矩阵时,为什么前几个元素会失真?

C - Why are first few elements distorted when I read a matrix from file?

我对 C 编程还很陌生,我想从给定的文件中读取一个矩阵,在文件中,元素是 space 分隔的。 我尝试使用以下代码,注意它编译得很快,但是当我检查矩阵中的内容时,每行中的前 2 个元素被扭曲为 -2145378576 22099:

typedef struct matrix {
  int nrow;
  int ncol;
  int** data;
} matrix;

matrix* mread(char* filename) {
  FILE* f = fopen(filename, "r");
  char line[256];

  matrix* result = malloc(sizeof(matrix));
  int** data = malloc(0);
  int ncol, nrow = 0;

  while (fgets(line, sizeof(line), f)) {
    char* token = strtok(line, " ");
    int* temp = malloc(sizeof(int));
    ncol = 0;
    while (token != NULL) {
      temp = realloc(temp, ++ncol * sizeof(int));
      temp[ncol - 1] = strtol(token, NULL, 10);
      token = strtok(NULL, " ");
    }

    data = realloc(data, ++nrow * sizeof(temp));
    data[nrow - 1] = temp;
    free(temp);
  }
  result->ncol = ncol;
  result->nrow = nrow;
  result->data = data;
  free(data);
  fclose(f);
  return result;
}

现在我尝试从项目 Euler #11 中读取矩阵,我发现每行中的前 2 个元素被扭曲了。但是,我无法弄清楚问题出在哪里(我知道它在 datarealloc 附近的某个地方...)

提前致谢!

您的程序有未定义的行为,因为您在将指针分配给 result 结构成员变量 data 并随后从函数 result 返回 result 后释放指针 mread() [假设您必须访问 mread()] 返回的 result->data :

    data[nrow - 1] = temp;
    free(temp);
....
....
result->data = data;
free(data);

你不应该free这里的tempdata。当您完成 mread() 返回的 result 指针时,它们应该被释放。确保首先释放 data 的所有 nrow,然后释放 data.

此外,您不需要将 malloc(0) 分配给 data。相反,将 NULL 分配给 data。当传递给它的指针为 NULL.

时,realloc 行为与调用 malloc(new_size) 相同