私はしばらくの間、このコードに取り組んできましたが、デバッグできないように見えるセグ フォールトに遭遇しました。関連するコードは次のとおりです。
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_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_num が返されるため、fread 呼び出しから Halo オブジェクトに関する正しい情報も収集します。
ありがとう!