gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 20:09:23 25 4
gpt4 key购买 nike

我对 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 个元素是扭曲的。但是,我无法弄清楚问题出在哪里(我知道它位于 datarealloc 附近...)

提前致谢!

最佳答案

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

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

您不应该在此处释放tempdata。当您使用完 mread() 返回的 result 指针后,它们应该被释放。确保首先释放所有 nrowdata,然后释放 data

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

关于C - 当我从文件中读取矩阵时,为什么前几个元素会变形?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52827241/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com