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
声明为 const
,printf("%p: ", &realNumber);
returns 是一个不正确的值,但 printf("%f\n", realNumber);
returns 是正确的。
这是错误还是我做了不该做的事?
我在 Windows 机器上使用 g++ 编译器(版本 6.3.0)。
在此先感谢您的帮助。
经过进一步调查,我意识到我使用的是非常旧的 GSL 版本。更新到最新的稳定版本后,描述的行为消失了。
我发现 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
声明为 const
,printf("%p: ", &realNumber);
returns 是一个不正确的值,但 printf("%f\n", realNumber);
returns 是正确的。
这是错误还是我做了不该做的事?
我在 Windows 机器上使用 g++ 编译器(版本 6.3.0)。
在此先感谢您的帮助。
经过进一步调查,我意识到我使用的是非常旧的 GSL 版本。更新到最新的稳定版本后,描述的行为消失了。