我有一个带有 fftw 函数的简单代码,有时工作正常,有时返回
Segmentation fault
,所以我用代码运行 Valgrind,这就是我得到的:
static const int nx = 128;
static const int ny = 128;
static const int nz = 128;
static const int ncomp = 2;
using namespace std;
void r2c3D(double rArr[], double cArr[][ncomp]);
int main(){
double *f;
f = (double*) fftw_malloc((nx*ny*nz) *sizeof(double));
memset(f, 42, (nx*ny*nz) * sizeof(double));
fftw_complex *fk;
fk = (fftw_complex*) fftw_malloc((nx*ny*nz) * sizeof(fftw_complex));
memset(fk, 42, (nx*ny*nz)* sizeof(fftw_complex));
r2c3D(f,fk);
free(f);
free(fk);
}
void r2c3D(double rArr[], double cArr[][ncomp]){
fftw_complex *input_array;
input_array = (fftw_complex*) fftw_malloc((nx*ny*nz)*sizeof(fftw_complex));
memcpy(input_array, rArr, (nx*ny*nz) * sizeof(fftw_complex));
fftw_plan forward = fftw_plan_dft_3d(nx, ny, nz, input_array, cArr, FFTW_FORWARD, FFTW_ESTIMATE);
fftw_execute(forward);
fftw_destroy_plan(forward);
fftw_cleanup();
fftw_free(input_array);
}
我收到的 Valgrind 消息是:
==265== Invalid read of size 8
==265== at 0x485294F: memmove (in /usr/libexec/valgrind/vgpreload_memcheck-amd64-linux.so)
==265== by 0x10938B: memcpy (string_fortified.h:29)
==265== by 0x10938B: r2c3D(double*, double (*) [2]) (MemoryLeakTest.cpp:74)
==265== by 0x10920B: main (string_fortified.h:59)
==265== Address 0x63d9098 is 16,777,240 bytes inside a block of size 16,777,248 in arena "client"
它指向我函数中的这一行:
memcpy(input_array, rArr, (nx*ny*nz) * sizeof(fftw_complex));
我仍然看不出上面的代码有什么问题!我整夜都在为此绞尽脑汁,我不知道为什么会发生这种事,我是不是错过了什么? 谢谢!
rArr
是 (nx*ny*nz) *sizeof(double)
而 input_array
是 (nx*ny*nz)*sizeof(fftw_complex)
,fftw_complex 是两个双精度数。
您将 f 分配为
f = (double*) fftw_malloc((nx*ny*nz) *sizeof(double));
但读作
memcpy(input_array, rArr, (nx*ny*nz) * sizeof(fftw_complex));
如果 sizeof(fftw_complex) 与 double 不同,你会得到错误