c - 具有正确文件长度和缓冲区分配的 fread 段错误

标签 c c++11 file-io io fread

我有一段代码将 2D float 组保存到二进制文件中,还有另一个代码读取二进制文件并将其放入 2D float 组中。

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

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,以命名很少)而不检查它们的返回值。这些功能中的任何一个都可能因多种原因而失败。如果您希望程序健壮,则不应在未检查前一个函数调用是否成功的情况下继续执行下一条语句。特别是,fopenmalloc 都可以返回 NULL。确保他们没有。

关于c - 具有正确文件长度和缓冲区分配的 fread 段错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52696393/

相关文章:

c - 如何等待线程启动?

c - 是否需要在DeleteObject()之前调用SelectObject()?

c++ - `std::array<T, 0>` 默认可构造,而 `T` 不可默认构造?

c++ - 寻求帮助将 SOLID 原则应用于文件 I/O 问题

c - 在 DOS/FAT 中缩小或部分截断文件

c++ - 将对象快照保存到文件的最佳方法

c - 使用另一个目录中另一个 C 文件中的函数?

c - strptime 中元素的顺序

c++ - 在不复制/移动元素的情况下初始化 std::array

php - 从 PHP GD 中的文件输出动画 GIF