如何正确初始化一些用于healpix子程序的指针?

时间:2017-06-15 18:22:23

标签: c valgrind

我无法在代码中找到错误源,在运行时会产生段错误。我知道错误在代码中基本上是:

#include "chealpix.h"
double *theta, *phi;
pix2ang_nest(8, 2, theta, phi);

valgrind的输出是:

Use of uninitialised value of size 8
Call stack:
pix2ang_z_phi
pix2ang_nest
main

我非常有信心这个错误的来源(如valgrind所说)是未初始化的指针thetaphi。我的问题是:如何正确初始化这些?我的理解是我要将这些指针传递给函数pix2ang_nest(),并且这个函数的作用是将返回值放在thetaphi指向的内存中。要使用这些变量,我会使用*取消引用它们,例如cos(*theta);。在这种情况下,我希望初始化发生在pix2ang_nest()内。有人会介意,请为我澄清一下吗?

此外,

valgrind消息中指定的唯一行是调用pix2ang_nest(8, 2, theta, phi);的行。换句话说,我没有得到healpix代码的行,我正在导致错误。我不知道这是否是healpix在fortran中的神器,或者我是否没有正确编译它。但是,healpix的其他功能确实可以运行并具有正确的输出。这是一个单独的问题,但我也会对任何人的想法感兴趣。

2 个答案:

答案 0 :(得分:0)

后两个值是" out"参数,所以你可以通过获取堆栈分配变量的地址来调用它。

#include "chealpix.h"
double theta, phi;
pix2ang_nest(8, 2, &theta, &phi);

thetaphi应包含在函数中填充的值。

答案 1 :(得分:0)

该函数很可能期望这些指针指向已分配的内存。由于您尚未为这些指针分配内存,因此该函数在取消引用它们时将调用未定义的行为。

不是创建指针,而是创建基类型的变量并传入它们的地址。

double theta, phi;
pix2ang_nest(8, 2, &theta, &phi);