繁体   English   中英

读入结构分割错误数组

[英]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*)个字节,并解释该位置处的字节-这些字节是读入的某些floatint值的一部分,而不是指针的-并尝试访问任意位置的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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM