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

C 为什么当我从文件中读取矩阵时,前几个元素会失真?,c,dynamic-arrays,C,Dynamic Arrays,我对C编程非常陌生,我希望从给定的文件中读取矩阵,在该文件中,元素是空间分隔的。 我尝试使用以下代码,注意它编译得很快,但当我检查矩阵中的内容时,每行的前2个元素被扭曲为-2145378576 22099: typedef struct matrix { int nrow; int ncol; int** data; } matrix; matrix* mread(char* filename) { FILE* f = fopen(filename, "r"); char

我对C编程非常陌生,我希望从给定的文件中读取矩阵,在该文件中,元素是空间分隔的。 我尝试使用以下代码,注意它编译得很快,但当我检查矩阵中的内容时,每行的前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;
}
现在我试着从ProjectEuler#11中读取矩阵,我发现每行的前2个元素都被扭曲了。但是,我无法找出问题所在(我知道它在
数据
realloc
附近的某个地方)


提前谢谢

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

您不应在此处
释放
temp
数据。当您处理完
mread()
返回的
result
指针时,应该释放它们。确保首先释放
数据的所有
nrow
,然后释放
数据


此外,您不需要将
malloc(0)
分配给
数据
。相反,将
NULL
分配给
数据
realloc
行为与调用
malloc(新大小)
相同,当传递给它的指针为
NULL

result->data=data;免费(数据)在这里,您将
数据
指针分配到
结果->数据
,然后释放
数据
。如果程序在此之后访问
result->data
,您将有未定义的行为。
data[now-1]
,在这句话中,我相信有一个输入错误
现在
应该是
nrow
。当I
data[nrow-1]=temp时,是否也存在同样的问题;免费(临时)?我打算使用
temp
data
作为传输数据的工具,这样一来,我就可以直观地释放内存。如果我不能释放他们,我怎么能做到这一点?非常感谢你!完成后我会释放内存,不,您没有使用
temp
data
所指向的内存
temp
内存分配给
data
nrow
,并且
数据
分配给
结果-/data
并从函数返回
结果。注:无需调用
strtok
,只需使用
strtol
即可使用
endptr
参数前进到读取的数字末尾之外的一个字符,并允许它处理任何插入的空格。
    data[nrow - 1] = temp;
    free(temp);
....
....
result->data = data;
free(data);