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



我对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;
}

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

提前感谢!

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

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

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

此外,您无需将malloc(0)分配给data。相反,请将NULL分配给datarealloc行为与NULL传递给它的指针malloc(new_size)调用相同。

最新更新