Valgrind 给出错误“大小 4 的读取无效”

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

我正在从文件中读取浮点数据,Valgrind 给出错误“大小 4 的读取无效”。我是 Valgrind 的新用户,不明白为什么会出现此错误。

我的代码是:

int main() 
{
    N = 220928;
    std::vector<std::complex<float>> rxTmp(N);

    FILE *fid;
    char fn[] = "data.bin";
    fid = fopen(fn, "rb");

    std::size_t ct = fread(&rxTmp[0],4,N,fid);

    fclose(fid);  

    return 0;
}

代码编译并执行没有错误,但 Valgrind 给出无效读取。

==41376== 1 errors in context 1 of 1:
==41376== Invalid read of size 4
==41376==    at 0x77E0180: fread (in /usr/lib64/libc-2.17.so)
==41376==    by 0x423F67: main (main.cc:77)
==41376==  Address 0x0 is not stack'd, malloc'd or (recently) free'd

其中第 77 行是 fread 语句。 文件大小正确;文件中有 220928*4 个浮点数。

读取任何小于 N 的值都会导致相同的 Valgrind 错误。

我尝试将读取的元素数量更改为小于文件中的元素数量,但仍然出现 Valgrind 错误

c++ valgrind fread
1个回答
0
投票

添加

fopen()
调用的基本错误检查后,我无法重现该问题:

#include <complex>
#include <iostream>
#include <vector>
#include <stdio.h>

int main() {
    std::size_t N = 220928;
    std::vector<std::complex<float> > rxTmp(N);
    FILE *fid = fopen("data.bin", "rb");
    if(!fid) {
        std::cerr << "Could not open file\n";
        return 1;
    }
    std::size_t ct = fread(&rxTmp[0],4,N,fid);
    fclose(fid);  
    return 0;
}
© www.soinside.com 2019 - 2024. All rights reserved.