Сегменты Fread с правильной длиной файла и распределением буфера - PullRequest
0 голосов
/ 08 октября 2018

У меня есть код, который сохраняет двумерный массив с плавающей точкой в ​​двоичный файл, и другой код, который считывает двоичный файл и помещает его в двумерный массив с плавающей точкой.

void write2DArrayToBinary(const char* file_name, void** array, size_t len_1D, size_t len_2D, size_t num_bytes_per_elem) {
  FILE* file = fopen(file_name, "wb");
  for (size_t i = 0; i < len_1D; i++) {
    fwrite(array[i], num_bytes_per_elem, len_2D, file);
  }
  fclose(file);
}

void read2DArrayFromBinary(void** array, size_t len_1d, size_t len_2d, size_t num_bytes_per_elem, const char* file_name) {
  FILE* file = fopen(file_name, "rb");
  for (size_t i = 0; i < len_1d; i++) {
    array[i] = malloc(num_bytes_per_elem * len_2d);
    fread(array[i], num_bytes_per_elem, len_2d, file);
  }
  fclose(file);
}

Первый находится внутри .Cфайл и последний находится в .CC (c ++ 11).Я вызываю функцию чтения следующим образом (я пропустил код unrelevent):

this->dilate_weights_prev = (float**)malloc(sizeof(float*) * this->num_layers);
read2DArrayFromBinary((void**)this->dilate_weights_prev, this->num_layers, this->dilate_weights_prev_len, sizeof(float), fileName);

Я проверил, что len_1D и len_2D в write2DArrrayToBinary и read2DArrayFromBinary одинаковы.Кроме того, я использовал gdb, и функция read segfaults на первой итерации.

Как вы думаете, что это вызвало холод?

1 Ответ

0 голосов
/ 08 октября 2018

Подводя итог тому, что я уже написал в комментариях: Вы вызываете несколько функций POSIX (fread, malloc и fopen, чтобы назвать несколько) без проверки их возвращаемых значений.Любая из этих функций может не работать по ряду причин.Если вы хотите, чтобы ваша программа была устойчивой, вам не следует переходить к следующему оператору, не проверив, был ли предыдущий вызов функции успешным.В частности, fopen и malloc могут возвращать NULL.Убедитесь, что они этого не делают.

...