C 将fread放入结构分割错误的数组中
我已经在编写这段代码一段时间了,我遇到了一个seg故障,似乎无法调试。以下是相关代码:C 将fread放入结构分割错误的数组中,c,file,struct,fread,calloc,C,File,Struct,Fread,Calloc,我已经在编写这段代码一段时间了,我遇到了一个seg故障,似乎无法调试。以下是相关代码: 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;
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*Halo_目录
出现故障的功能:
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_目录[10000]->x上失败;线路,或对fread调用后分配的内存的任何其他访问。我知道我正在传递一个有效的文件,因为它可以正确地读取halo_num。它还从fread调用中收集有关Halo对象的正确信息,就像我调用fread并检查返回值时返回Halo_num一样
谢谢 这真的可以编译吗 问题在于halo_目录是指向数组的指针,而不是指针数组。您应该使用printf%f\n,halo_目录[10000].x
我假设10000只是为了测试目的?因为我没有看到任何东西可以保证halo_目录中有10000条记录。这真的可以编译吗
typedef struct Halo* Halo;
问题在于halo_目录是指向数组的指针,而不是指针数组。您应该使用printf%f\n,halo_目录[10000].x
我假设10000只是为了测试目的?因为我没有看到任何东西可以保证halo_目录中有10000条记录
typedef struct Halo* Halo;
这是个糟糕的主意,可能是你问题的原因
你有一个全局变量
Halo *halo_catalog;
因此,结构光环**。但是在
距离Halo_目录指向的位置10000*sizeofstruct Halo*字节,并解释该位置的字节-这些字节是某些浮点或整数读入值的一部分,而不是指针-并尝试访问该错误解释导致的任意位置的x组件
你应该
typedef struct Halo Halo;
并使用halo_catalog[10000].x修复该问题
另一个问题是fread返回它已成功读取的项目数,如果该数量小于请求的数量,它仍然可以是正数
捕获fread的返回值,并使用该值确定读取是否完全成功。另外,在尝试打印halo_目录[10000].x之前,请确保10000是有效的索引
这是个糟糕的主意,可能是你问题的原因
你有一个全局变量
Halo *halo_catalog;
因此,结构光环**。但是在
距离Halo_目录指向的位置10000*sizeofstruct Halo*字节,并解释该位置的字节-这些字节是某些浮点或整数读入值的一部分,而不是指针-并尝试访问该错误解释导致的任意位置的x组件
你应该
typedef struct Halo Halo;
并使用halo_catalog[10000].x修复该问题
另一个问题是fread返回它已成功读取的项目数,如果该数量小于请求的数量,它仍然可以是正数
捕获fread的返回值,并使用该值确定读取是否完全成功。另外,在打印halo_目录[10000].x之前,请确保10000是一个有效索引。它不会编译。大约有60k个光环,所以这不是问题。另外,我认为我的问题源于对typedef的误解。我将我的定义改为Halo Halo_目录,而不是Halo*。然后我对你的代码做了修改,它成功了。所以当我做typdef时,它会改变Halo*来表示一个指向Halo的指针和一个指向Halo对象数组的指针?是的。。。在typedef中使用指针很少是个好主意。事实上,我在最初的答复中没有提到这一点。因此,halo_目录是指向halo_数组的指针。。。因此它确实编译了,但不起作用。你分配了一系列光环,这就是我在最初的回复中看到的。编译器可能应该抱怨您在calloc调用中将Halo*分配给Halo**。。。不知道你有没有收到警告。无论如何,另一个答案是更好的,因为我错过了typedef中的指针。它确实可以编译。大约有60k个光环,所以这不是问题。另外,我认为我的问题源于对typedef的误解。我将我的定义改为Halo Halo_目录,而不是Halo*。然后我对你的代码做了修改,它成功了。所以当我做typdef时,它会改变Halo*来表示一个指向Halo的指针和一个指向Halo对象数组的指针?是的。。。在typedef中使用指针很少是个好主意。事实上,我在最初的答复中没有提到这一点。因此,halo_目录是指向halo_数组的指针。。。因此它确实编译了,但不起作用。你分配了一系列光环,这就是我在最初的回复中看到的。编译器可能应该抱怨您在calloc调用中将Halo*分配给Halo**。。。不知道你有没有收到警告。无论如何,另一个答案是更好的,因为我错过了typedef中的指针;输入定义结构Halo Halo;;和halo_目录[100] 00]>x到halo_目录[10000]。x.尝试更改typedef结构halo*halo;输入定义结构Halo Halo;;和halo_目录[10000]->x到halo_目录[10000].x。