使用正确的文件长度和缓冲区分配 fread segfaults

fread segfaults with correct file length and buffer allocation

我有将二维浮点数组保存到二进制文件的代码,以及另一个读取二进制文件并将其放入二维浮点数组的代码。

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 ) 中。 我这样调用读取函数(我省略了不相关的代码):

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);

我检查过write2DArrrayToBinaryread2DArrayFromBinary中的len_1Dlen_2D是一样的。另外,我使用了 gdb,并且在第一次迭代时读取函数出现段错误。

您认为寒冷是什么原因造成的?

总结一下我已经在评论中写的内容:您调用了几个 POSIX 函数(freadmallocfopen,仅举几例)而没有检查它们的 return 值。由于多种原因,这些功能中的任何一个都可能失败。如果您希望您的程序健壮,则不应在不检查前一个函数调用是否成功的情况下继续执行下一条语句。特别是,fopenmalloc 都可以 return 为 NULL。确保他们没有。