我在GNU Science Library复数函数中看到了一些奇怪的行为。以下代码片段演示了该问题:
#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);
将返回错误的值,但printf("%f\n", realNumber);
将返回正确的值。
这是一个bug,还是我做了一些不应该做的事情?
我在Windows机上使用g++编译器(版本6.3.0)。
提前感谢您的帮助。
发布于 2018-06-07 04:27:45
经过进一步的研究,我意识到我使用的是一个非常旧的GSL版本。在更新到最新的稳定版本后,描述的行为消失了。
https://stackoverflow.com/questions/50701248
复制相似问题