读取文件时字符缓冲区溢出

时间:2017-05-26 00:13:17

标签: c++ file struct

我试图从文件中读取数据,但我收到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。

感谢。

2 个答案:

答案 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,因此您正在将字节读取到堆栈上,直到它超出。