我已经研究这段代码一段时间了,但我遇到了一个我似乎无法调试的段错误。这是相关代码:
typedef struct Halo* Halo;
struct Halo
{
float x, y, z;
float vx, vy, vz;
int n200a;
float m200a;
float r200a;
int n200c;
float m200c;
float r200c;
int n500a;
float m500a;
float r500a;
int n500c;
float m500c;
float r500c;
};
全局变量:
光环 *halo_catalog;
失败的函数:
int loadHaloCatalog(char *filename)
{
FILE *catalog_file;
long long halo_num;
catalog_file = fopen(filename, "rb");
if (catalog_file == NULL) {
printf("Could not open halo catalog: %s\n", filename);
return -1;
}
if (fread(&halo_num, sizeof(long long), 1, catalog_file) < 0) {
printf("Could not read number of halos\n");
return -1;
}
halo_catalog = (Halo *)calloc(halo_num, sizeof(struct Halo));
if (fread(halo_catalog, sizeof(struct Halo), halo_num, catalog_file) < 0) {
printf("Could not read that number of halos\n");
return -1;
}
printf("%f\n", halo_catalog[10000]->x);
printf("done\n");
fclose(catalog_file);
return (int)halo_num;
}
它在 "printf("%f\n", halo_catalog[10000]->x); 上失败了行,或对 fread 调用后分配的内存的任何其他访问。我知道我传递的是一个有效文件,因为它可以正确读取 halo_num。它还从 fread 调用中收集有关 Halo 对象的正确信息,因为当我调用 fread 并检查返回时它返回 halo_num。
谢谢!
最佳答案
typedef struct Halo* Halo;
这是个糟糕的主意,可能是您遇到问题的原因。
你有一个全局变量
Halo *halo_catalog;
所以一个 struct Halo**
。但是在
halo_catalog = (Halo *)calloc(halo_num, sizeof(struct Halo));
if (fread(halo_catalog, sizeof(struct Halo), halo_num, catalog_file) < 0) {
您可以像使用 struct Halo*
一样使用它。
然后你索引
printf("%f\n", halo_catalog[10000]->x);
距离 halo_catalog
指向的位置 10000 * sizeof(struct Halo*)
字节,并解释该位置的字节 - 这是值的一部分一些 float
或 int
读入,而不是指针 - 并尝试访问任意位置的 x
组件是该误解的结果.
你应该
typedef struct Halo Halo;
并使用 halo_catalog[10000].x
解决该问题。
另一个问题是fread
返回它成功读取的项目数,如果它小于请求的数量,它仍然可以是正数。
捕获fread
的返回值,并以此判断读取是否完全成功。此外,在尝试打印 halo_catalog[10000].x
之前,请确保 10000 是一个有效索引。
关于c - fread into array of structs 段错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15887977/