首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >fread到结构数组分段错误

fread到结构数组分段错误
EN

Stack Overflow用户
提问于 2013-04-09 04:07:08
回答 2查看 947关注 0票数 1

我已经在这段代码上工作了一段时间了,我遇到了一个似乎无法调试的seg错误。相关代码如下:

代码语言:javascript
复制
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;

失败的函数:

代码语言:javascript
复制
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_catalog10000->x);“行失败,或者在fread调用之后对分配的内存的任何其他访问失败。我知道我传入的是一个有效的文件,因为它可以正确地读取halo_num。它还从fread调用中收集有关光晕对象的正确信息,因为当我调用fread并检查返回时,它将返回halo_num。

谢谢!

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2013-04-09 04:22:36

代码语言:javascript
复制
typedef struct Halo* Halo;

这是一个糟糕的想法,也可能是你的问题的原因。

你有一个全局变量

代码语言:javascript
复制
Halo *halo_catalog;

所以是个struct Halo**。但在

代码语言:javascript
复制
halo_catalog = (Halo *)calloc(halo_num, sizeof(struct Halo));  
if (fread(halo_catalog, sizeof(struct Halo), halo_num, catalog_file) < 0) {

您可以像使用struct Halo*一样使用它。

然后你可以建立索引

代码语言:javascript
复制
printf("%f\n", halo_catalog[10000]->x);

在距halo_catalog所指向的10000 * sizeof(struct Halo*)字节的距离处,解释该位置的字节-这是读入的某些floatint的值的一部分,而不是指针-并尝试访问任意位置的x组件,无论该错误解释的结果是什么。

你应该

代码语言:javascript
复制
typedef struct Halo Halo;

并使用halo_catalog[10000].x来解决这个问题。

另一个问题是,fread返回它成功读取的项目数量,如果该数量小于请求的数量,它仍然可以是一个正数。

捕获fread的返回值,并使用该返回值确定读取是否完全成功。此外,在尝试打印halo_catalog[10000].x之前,请确保10000是有效的索引。

票数 3
EN

Stack Overflow用户

发布于 2013-04-09 04:09:59

这真的能编译吗?

问题是halo_catalog是指向数组的指针,而不是指针数组。您应该使用printf("%f\n", halo_catalog[10000].x);

我猜10000是测试用的吧?因为我没有看到任何东西可以保证halo_catalog中有10000条记录。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/15887977

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档