c - fread into array of structs 段错误

标签 c file struct fread calloc

我已经研究这段代码一段时间了,但我遇到了一个我似乎无法调试的段错误。这是相关代码:

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 是一个有效索引。

关于c - fread into array of structs 段错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15887977/

相关文章:

iphone - 如何停止 Objective C 中的函数递归?

c - TCP 服务器/客户端如何保持连接?

c - 一个字符串的长度

c - 在 C 中的文本文件中记录和替换变量

java - 使用 Java 中的文件选择器从任何位置选择 txt 文件

go - 从父方法访问所有字段

Julia 中的结构文字

c++ - Fputc 在 if else 中不起作用

c++ - 将文件中的数据读入单独的 Int 值

c++ - 如何在结构体中声明填充?