c - fread segfaults 具有正确的文件长度和缓冲区分配
问题描述
我有将二维浮点数组保存到二进制文件中的代码,以及另一个读取二进制文件并将其放入二维浮点数组的代码。
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);
我已经检查了len_1D
and len_2D
in write2DArrrayToBinary
andread2DArrayFromBinary
是一样的。另外,我使用了 gdb,并且 read 函数在第一次迭代时出现了段错误。
你认为寒冷是什么原因造成的?
解决方案
总结一下我在评论中已经写过的内容:您调用了几个 POSIX 函数(fread
、malloc
和fopen
,仅举几例)而不检查它们的返回值。这些功能中的任何一个都可能由于多种原因而失败。如果您希望您的程序健壮,您不应该在不检查前一个函数调用是否成功的情况下继续执行下一个语句。特别是,两者都fopen
可以malloc
返回 NULL。确保他们没有。
推荐阅读
- python - 如何获得 **only** 作为 Twint (Twitter) 输出的推文数量?
- android - 如何从图像的特定块中提取文本?[机器学习套件]
- c# - 如何仅使用循环来划分两个用户输入并且不允许使用任何操作?
- asp.net - ASP.NET Core - 使用绑定的 ViewModel 在视图内填充表单
- android - CI/CD BitRise React Native Android 构建失败
- wcf - 2 个应用程序和一个使用 WCF 的 Windows 服务。谁是服务器,谁是客户端?
- ajax - 如何使用 Json 数据生成 DataTable
- python-3.x - python pandas应用如何用lambda函数替换函数?
- python - 全局范围内可用的本地变量?
- python - Django 重定向什么都不做