使用 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()
的文档:
ordering
和 coordsys
是 output 参数 - 它们是指向 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 coordsys
和 ordering
都传递给 fits_read_key()
,因此 coordsys
被视为一个字符串。
我正在尝试使用 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()
的文档:
ordering
和 coordsys
是 output 参数 - 它们是指向 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 coordsys
和 ordering
都传递给 fits_read_key()
,因此 coordsys
被视为一个字符串。