Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/file/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 将fread放入结构分割错误的数组中_C_File_Struct_Fread_Calloc - Fatal编程技术网

C 将fread放入结构分割错误的数组中

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;

我已经在编写这段代码一段时间了,我遇到了一个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;  
    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。