我正在尝试在Amazon Linux EC2实例上运行我的C 程序,并在MacOS和Ubuntu上运行良好的代码中获得分割故障。代码摘录是此
vector<unsigned char> header(8);
bool bool_byte[8];
unsigned char seg_byte;
int byte_num = 0;
for(int i = 0; i < 32; i++) {
bool_byte[i] = snb[i];
if(i % 8 == 7) {
seg_byte = to_byte(bool_byte);
byte_num = (i + 1)/8;
cout << "byte_num minus one is " << to_string(byte_num - 1) << endl;
cout << "vector size " << to_string(header.size()) << endl;
header[byte_num - 1] = seg_byte;
}
}
我将32位布尔数组转换为4个字节的无符号字符。seg_byte
这里可能是' 0',但是即使我用'a'替换seg_byte
,或使用header.reserve(8)
并使用push_back
而不是数组索引,我仍然会得到分割错误。我还尝试使用vector<char>
并将其铸造为char
,但仍会获得分段故障。cout
语句打印此。
byte_num minus one is 0
vector size 8
byte_num minus one is 1
vector size 139991841770280
Segmentation fault
如果我编写一个仅运行A用于循环填充vector<unsigned char>
的小test.cpp
文件,我没有任何错误。
在MacOS和Ubuntu
上运行良好的代码中获得分割故障
如果您使用地址消毒剂构建程序(您应该始终习惯于(,它将立即告诉您 关于缓冲区的流失。
用地址消毒剂建造非常容易:
g++ -fsanitize=address -g test.cpp