Я читаю данные с плавающей запятой из файла, и 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.
Код неполный без заголовков. Сообщение об ошибке не соответствует коду (main.cc:77). N
не заявлено. Почему вы используете fopen()
и fread()
в коде C++?
Какая ОС, архитектура ЦП, версия Valgrind, компилятор и стандартная библиотека C++?
Разве вам не следует использовать sizeof(complex<float>) вместо 4?
Проверьте errno, чтобы узнать, почему ваш вызов fopen не работает.
Есть ли причина не использовать fstream
и std::copy()
? (или std::copy_n()
Мне не удалось воспроизвести проблему после добавления базовой проверки ошибок вызова fopen()
. Я также изменил аргумент fread()
size
с 4
на sizeof rxTmp[0]
, который есть 8
в моей системе.
#include <complex>
#include <cstdio>
#include <iostream>
#include <vector>
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; // fclose(NULL) is undefined
}
std::size_t ct = fread(&rxTmp[0],sizeof rxTmp[0],N,fid);
fclose(fid);
return 0;
}
Если это ответ на ваш вопрос, примите его, нажав на галочку рядом с ответом.
Проформа - #include <cstdio>
:)
Ага, проформа облажалась x2 :)
размер файла должен составлять 220928 комплексов, 220928*2 с плавающей запятой, 220928*2*4 байта. Но в вашем файле должно быть достаточно данных как есть. Ваш файл правильно открыт? Вы не проверили fid на ноль. Я подозреваю, что 4 байта, которые fread пытается прочитать, - это 4 байта, на которые указывает нулевой идентификатор (инкриминируемый адрес - 0x0, как указано)