【发布时间】:2022-06-10 22:59:45
【问题描述】:
我有以下 C++ 代码,它尝试读取二进制文件,并将生成的 32 位值打印为十六进制:
std::string binary_data_file("font.dat");
struct stat statbuff;
stat(binary_data_file.c_str(), &statbuff);
file_size = statbuff.st_size;
void *data_buffer;
posix_memalign(&data_buffer, 4096, file_size);
std::ifstream data_input_file(binary_data_file.c_str(), std::ios::in | std::ios::binary);
data_input_file.read((char *) data_buffer, file_size);
data_input_file.close();
int * debug_buffer = (int * ) data_buffer;
for (int j = 0; j< 148481; j++) {
std::cout << "Data size: " << std::dec << file_size << std::endl;
std::cout << "Element: " << j << " Value: " << std::hex << *(debug_buffer + j) << std::endl;
}
当 j == 148480 时,此代码会导致分段错误
Data size: 211200
Element: 148477 Value: 0
Data size: 211200
Element: 148478 Value: 0
Data size: 211200
Element: 148479 Value: 0
Data size: 211200
Segmentation fault (core dumped)
为什么会这样?当然缓冲区大小应该等于211200,对吧,所以j应该可以达到211200?
【问题讨论】:
-
传递给
posix_memalign的大小是字节数。您的j是许多int元素。int在您的 C++ 实现中,每个元素可能是四个字节。那么在 211,200 字节中只有 211,200/4 = 52,800int元素可用。在未来的调试问题中,始终包含minimal reproducible example。
标签: c++