gsl_complex导致内存溢出

gsl_complex causing memory overflow

我发现 GNU 科学图书馆的复数函数有一些奇怪的行为。以下代码段演示了该问题:

#include <iostream>
#include <gsl/gsl_complex.h>
#include <gsl/gsl_complex_math.h>

int main() {
    double realNumber = 1.0;
    gsl_complex complexNumber;

    GSL_SET_COMPLEX(&complexNumber, 1.0, 1.0);

    printf("%p: ", &realNumber);
    printf("%f\n", realNumber);

    gsl_complex_add(complexNumber,complexNumber);

    printf("%p: ", &realNumber);
    printf("%f\n", realNumber);

    return 0;
}

输出为

0061FF18: 1.000000
0061FF1C: 0.000000

函数 gsl_complex_add 将指针的值更改为 realNumber,使其不再指向 realNumber,即使 realNumber 似乎不是以任何方式链接到函数。我认为这是由于某种溢出造成的。

如果我使用std::cout而不是printf,问题就不会出现;我想这是由于编译器造成的。

如果我将 realNumber 声明为 static,则不会出现该问题。

如果我将 realNumber 声明为 constprintf("%p: ", &realNumber); returns 是一个不正确的值,但 printf("%f\n", realNumber); returns 是正确的。

这是错误还是我做了不该做的事?

我在 Windows 机器上使用 g++ 编译器(版本 6.3.0)。

在此先感谢您的帮助。

经过进一步调查,我意识到我使用的是非常旧的 GSL 版本。更新到最新的稳定版本后,描述的行为消失了。