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 个元素被扭曲了。但是,我无法弄清楚问题出在哪里(我知道它在 data
的 realloc
附近的某个地方...)
提前致谢!
您的程序有未定义的行为,因为您在将指针分配给 result
结构成员变量 data
并随后从函数 result
返回 result
后释放指针 mread()
[假设您必须访问 mread()
] 返回的 result->data
:
data[nrow - 1] = temp;
free(temp);
....
....
result->data = data;
free(data);
你不应该free
这里的temp
和data
。当您完成 mread()
返回的 result
指针时,它们应该被释放。确保首先释放 data
的所有 nrow
,然后释放 data
.
此外,您不需要将 malloc(0)
分配给 data
。相反,将 NULL
分配给 data
。当传递给它的指针为 NULL
.
时,realloc
行为与调用 malloc(new_size)
相同
我对 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 个元素被扭曲了。但是,我无法弄清楚问题出在哪里(我知道它在 data
的 realloc
附近的某个地方...)
提前致谢!
您的程序有未定义的行为,因为您在将指针分配给 result
结构成员变量 data
并随后从函数 result
返回 result
后释放指针 mread()
[假设您必须访问 mread()
] 返回的 result->data
:
data[nrow - 1] = temp;
free(temp);
....
....
result->data = data;
free(data);
你不应该free
这里的temp
和data
。当您完成 mread()
返回的 result
指针时,它们应该被释放。确保首先释放 data
的所有 nrow
,然后释放 data
.
此外,您不需要将 malloc(0)
分配给 data
。相反,将 NULL
分配给 data
。当传递给它的指针为 NULL
.
realloc
行为与调用 malloc(new_size)
相同