我有将2D浮点数组保存到二进制文件中的代码,还有另一个读取二进制文件并将其放入2D浮点数组中的代码。
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函数(我省略了irrelevent代码):
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。
您认为感冒是由什么引起的?
答案 0 :(得分:1)
总结一下我已经在评论中写的内容:您调用了多个POSIX函数(fread
,malloc
和fopen
,仅举几例),而没有检查它们的返回值。这些功能中的任何一个都可能由于多种原因而失败。如果要使程序更健壮,则应在不检查上一个函数调用是否成功的情况下继续执行下一条语句。特别是fopen
和malloc
都可以返回NULL。确保他们没有。