我试图从文件中读取数据,但我收到STATUS_STACK_BUFFER_OVERRUN错误并且应用程序崩溃了。
我有一个结构:
struct BSPEntities
{
char* ents;
};
我正在阅读文件:
BSPEntities entities
ifstream mapfile;
int size = 54506;
int offset = 5182600;
entities.ents = new char[size];
mapfile.seekg(offset, ios::beg);
mapfile.read((char *)(&entities.ents), size);
"大小"和"偏移"是从文件加载并且已知有效的值。我有预处理器指令#pragma pack(1)和#pragma push around BSPEntities struct。
感谢。
答案 0 :(得分:2)
&entities.ents
是指向char的指针。指向(指向char的指针)的对象可能只有4或8个字节,具体取决于您要定位的体系结构,但您尝试向其写入54,506个字节。显然54,506大于8,所以你要在指针的末尾写字,并且行为是未定义的。
该读取应该只是mapfile.read(entities.ents, size);
此外,你不需要在这里搞砸#pragma pack
,除非有更复杂的事情发生,你没有表现出来。
答案 1 :(得分:1)
class PlacesViewController: UIViewController, UITableViewDataSource {
let tableView = UITableView()
override func viewDidLoad() {
super.viewDidLoad()
tableView.register(UINib(), forCellReuseIdentifier: .wololo)
}
func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
return tableView.dequeueReusableHeaderFooterView(withIdentifier: .wololo)
}
}
应该是
mapfile.read((char *)(&entities.ents), size);
不是传递mapfile.read(entities.ents, size);
指向的堆内存块的地址,而是传递ents
本身的地址。并且由于在堆栈上分配了ents
,因此您正在将字节读取到堆栈上,直到它超出。