Valgrind:为什么我会在使用 memcpy 时出现分段错误错误

问题描述 投票:0回答:2

我有一个带有 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));

我仍然看不出上面的代码有什么问题!我整夜都在为此绞尽脑汁,我不知道为什么会发生这种事,我是不是错过了什么? 谢谢!

c++ segmentation-fault valgrind fftw
2个回答
1
投票

rArr
(nx*ny*nz) *sizeof(double)
input_array
(nx*ny*nz)*sizeof(fftw_complex)
,fftw_complex 是两个双精度数。


1
投票

您将 f 分配为

f = (double*) fftw_malloc((nx*ny*nz) *sizeof(double));

但读作

memcpy(input_array, rArr, (nx*ny*nz) * sizeof(fftw_complex));

如果 sizeof(fftw_complex) 与 double 不同,你会得到错误

© www.soinside.com 2019 - 2024. All rights reserved.