使用 healpix 读取 FITS 文件时出现分段错误

segmentation fault while reading a FITS file with healpix

我正在尝试使用 C 代码用 healpix 打开 FITS 文件:

#define _GNU_SOURCE
#include <stdlib.h>
#include <stdio.h>
#include <math.h>
#include "chealpix.h"
#include "fitsio.h"
#include <string.h>
#include "fitsio2.h"

int main(int argc, char **argv){

        char *coordsys="G";
        char *order="RING";
        long nside;
        long *p_nside=&nside;
        nside=512.;
        float *map;
        map=read_healpix_map("file.fits",p_nside,coordsys,order);
         
    return(0);
}

这段代码returns一个segmentation fault (core dumped)当使用gdb时,我得到

Program received signal SIGSEGV, Segmentation fault.
ffgkys (status=0x7fffffffdaf4, comm=<optimized out>, value=0x55555555a004 "G", keyname=<optimized out>, 
    fptr=<optimized out>) at getkey.c:808
808     value[0] = '[=11=]';

这是我第一次使用healpix,我不知道是什么导致了这个问题。有谁知道哪里出了问题?

根据 read_healpix_map() 的文档:

orderingcoordsysoutput 参数 - 它们是指向 space 函数将写入结果的指针。您已经传递了指向内存中字符串常量的指针,这些常量通常被标记为只读,并且在任何情况下都可能不够大以接收结果。

nside 也是一个输出参数,将其初始化为 512 没有任何意义。你不需要 p_nside;你可以简单地通过 &nside

这不是最清晰的界面;具体来说,不清楚 coordsys 是字符串还是单个 char。该文档使用单引号,因此您可能会假设 char 但它对 ordering 也是如此,这显然是一个字符串。最安全的假设是 coordsys 是一个字符串——它不会造成任何伤害。

    char  coordsys[] = "G";    // This will be overwritten
    char  order[] = "NESTED" ; // This will be overwritten, 
                                  initialise to largest expected string
                                  to ensure sufficient space is allocated
    long nside = 0 ;
    float* map = read_healpix_map( "file.fits", &nside, coordsys, order ) ;

    printf( "nside:%ld, coordsys:%s, order:%s", nside, coordsys, order ) ;

Post 脚本:查看 source code coordsysordering 都传递给 fits_read_key(),因此 coordsys 被视为一个字符串。