将数组传递给C 函数时,segfault
Segfault when passing array to C++ function
我正在编写一个函数,以读取C 中二进制文件的数组。这是我的功能:
#include <iostream>
#include <fstream>
template <typename T>
int bread(T array_out[], int array_size, const char FILENAME[]) {
// Open file
std::ifstream input_file (FILENAME, std::ios::in | std::ios::binary
| std::ios::ate);
// Check that the file was opened correctly
if (input_file.is_open()) {
// Check that the file size matches the array size
std::streampos file_size = input_file.tellg();
if (file_size == array_size) {
// Read the array contents from the file
input_file.seekg(0, std::ios::beg);
input_file.read(reinterpret_cast<char *>(&array_out), array_size);
// Close file
input_file.close();
} else {
std::cerr << "File " << FILENAME << " is not of expected size.n";
std::cerr << " File size:t" << file_size << " Bn";
std::cerr << " Expectedt" << array_size << " Bn";
// Close file
input_file.close();
return -2;
}
} else {
std::cerr << "Failed to open file " << FILENAME << "n";
return -1;
}
return 0;
}
没有| std::ios::ate
,这将计算文件大小为0并返回-2
。这是有道理的。
但是,一旦我包括| std::ios::ate
(或作为替代方案,input_file.seekg(0, std::ios::end);
),该函数的执行就会使用segfault失败。在某些情况下,在文件中显然可以在文件中工作,因为input_file.seekg(0, std::ios::beg);
按预期工作。
我的猜测是输入文件中可能没有EOF标记。如果是这样,是否有某种方法可以安全处理?
编辑:此功能在此处调用:
int verify_buff[SIZE];
Ierr = bread(verify_buff, sizeof(verify_buff), "serial.bin");
if (Ierr != 0) {
std::cerr << "Error " << Ierr << " in function breadn";
return Ierr;
}
其中 SIZE
是一个全局常数定义为1024。
在segfault,
array_size = 4096
array_out = 0x7ffd5dca20e0
完整的segfault消息:
[physlogin:81411] *** Process received signal ***
[physlogin:81411] Signal: Segmentation fault (11)
[physlogin:81411] Signal code: Address not mapped (1)
[physlogin:81411] Failing at address: 0x1
[physlogin:81411] [ 0] /lib64/libpthread.so.0[0x3cb300f7e0]
[physlogin:81411] [ 1] /lib64/libc.so.6(fclose+0x4)[0x3cb2466344]
[physlogin:81411] [ 2] /usr/lib64/libstdc++.so.6(_ZNSt12__basic_fileIcE5closeEv+0x4c)[0x3cb78ba5ac]
[physlogin:81411] [ 3] /usr/lib64/libstdc++.so.6(_ZNSt13basic_filebufIcSt11char_traitsIcEE5closeEv+0xb7)[0x3cb786cb77]
[physlogin:81411] [ 4] /usr/lib64/libstdc++.so.6(_ZNSt14basic_ifstreamIcSt11char_traitsIcEE5closeEv+0xd)[0x3cb786ebfd]
[physlogin:81411] [ 5] Q3_gw639.exe[0x40dec5]
[physlogin:81411] [ 6] Q3_gw639.exe[0x40ea06]
[physlogin:81411] *** End of error message ***
一个主要问题是您呼叫read
:
input_file.read(reinterpret_cast<char *>(&array_out), array_size);
由于array_out
已经是T*
,因此该行试图读取指针的地址。这是不正确的 - 您想做的是:
input_file.read(reinterpret_cast<char *>(array_out), array_size);
请注意您的功能声明:
template <typename T>
int bread(T array_out[], int array_size, const char FILENAME[])
与这个:
没有什么不同template <typename T>
int bread(T* array_out, int array_size, const char* FILENAME)
即使第一个看起来像是收到数组,但不是。通过名称将数组传递给指针的参数衰减,因此您正在处理功能中的指针。
相关文章:
- SegFault 同时使用 std::string::operator+= 和函数作为参数
- 导致SegFault C++的析构函数
- 将数组传递给C 函数时,segfault
- 用于评估导致Segfault的Postfix的函数
- SegFault将插入std :: vector的成员函数插入std :: vector
- 类析构函数 SEGFAULT
- std::函数析构函数中的Segfault
- 在函数结束后仅释放 Segfault 与 vsnprintf 一起消失
- 主函数执行之前的C++segfault
- 调用一些PyObject函数会导致segfault-Boost python
- 在构造函数中使用curl_easy_init会导致segfault
- 析构函数上的Segfault
- 通过多个函数传递指针并获取segfault
- v8在Windows上的HandleScope构造函数中的SegFault
- 在析构函数中释放内存时出现segfault
- 调用结构的虚函数时出现segfault
- 将矢量指针传递给函数会导致segfault
- 当类被创建为shared_ptr时,添加到类中的其他函数会导致segfault
- 为什么我的合并函数会给我一个segfault
- 调用 DLL 函数的 SEGFAULT