[英]fread into array of structs segmentation fault
我已经在这段代码上工作了一段时间了,遇到了我似乎无法调试的段错误。 以下是相关代码:
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是有效索引。
真的可以编译吗?
问题是halo_catalog是指向数组的指针,而不是指针数组。 您应该使用printf("%f\\n", halo_catalog[10000].x);
我假设10000仅用于测试目的? 因为我什么都看不到,所以不能保证halo_catalog中有10000条记录。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.